0Pricing
Java Academy · Урок

Function и BiFunction

Функционально преобразуйте значения

«Function и BiFunction» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Что представляет собой функция

Function<T, R> — основной интерфейс преобразования в java.util.function. Он принимает один аргумент типа T и возвращает результат типа R.

  • Его единственный абстрактный метод — R apply(T t).
  • Он моделирует чистое преобразование входных данных в выходные.
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<String, Integer> length = s -> s.length();
        System.out.println(length.apply("hello"));
    }
}

Вызов apply

Вызвать Function можно с помощью apply. Тело лямбда-выражения содержит логику преобразования.

  • Типы входных и выходных данных могут различаться.
  • Ссылкой на метод, например String::toUpperCase, можно заменить лямбда-выражение.
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<String, String> upper = String::toUpperCase;
        System.out.println(upper.apply("java"));
    }
}

Композиция с andThen

andThen соединяет функции: результат первой становится входными данными для второй.

  • f.andThen(g) означает g(f(x)).
  • Читается слева направо.
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<Integer, Integer> times2 = n -> n * 2;
        Function<Integer, Integer> plus3 = n -> n + 3;
        System.out.println(times2.andThen(plus3).apply(5));
    }
}

Композиция с compose

compose сначала выполняет функцию-аргумент.

  • f.compose(g) означает f(g(x)).
  • Это зеркальное отражение andThen.
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<Integer, Integer> times2 = n -> n * 2;
        Function<Integer, Integer> plus3 = n -> n + 3;
        System.out.println(times2.compose(plus3).apply(5));
    }
}

Function.identity

Function.identity() возвращает функцию, которая возвращает свои входные данные без изменений.

  • Полезна в сборщиках потоков и отображениях по умолчанию.
  • Эквивалентна x -> x.
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<String, String> id = Function.identity();
        System.out.println(id.apply("unchanged"));
    }
}

Знакомство с BiFunction

BiFunction<T, U, R> принимает два аргумента и возвращает один результат.

  • Его метод — R apply(T t, U u).
  • Он отлично подходит для объединения двух значений, например для слияния отображений.
import java.util.function.BiFunction;

public class Main {
    public static void main(String[] args) {
        BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
        System.out.println(add.apply(4, 6));
    }
}

BiFunction с разными типами

Все три параметра типа BiFunction могут различаться.

  • Здесь мы объединяем String и int в String.
import java.util.function.BiFunction;

public class Main {
    public static void main(String[] args) {
        BiFunction<String, Integer, String> repeat = (s, n) -> s.repeat(n);
        System.out.println(repeat.apply("ab", 3));
    }
}

BiFunction и andThen

BiFunction также поддерживает andThen, принимая однопараметричную Function для последующей обработки результата.

  • У BiFunction нет compose, потому что для него потребовались бы два входных значения.
import java.util.function.BiFunction;
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
        Function<Integer, String> label = n -> "sum=" + n;
        System.out.println(add.andThen(label).apply(7, 8));
    }
}

Функции в коллекциях

Многие программные интерфейсы принимают Function. Например, Map.computeIfAbsent принимает функцию отображения для отсутствующих ключей.

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> lengths = new HashMap<>();
        lengths.computeIfAbsent("hello", String::length);
        System.out.println(lengths);
    }
}

Хранение функций в переменных

Поскольку функции являются объектами, их можно хранить, передавать и возвращать. Это основа Java функционального стиля.

import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<Integer, Integer> square = n -> n * n;
        Function<Integer, Integer> cube = n -> n * n * n;
        Function<Integer, Integer> chosen = square;
        System.out.println(chosen.apply(5));
    }
}

Построение конвейера

Многократное соединение с помощью andThen создаёт понятный и пригодный для повторного использования конвейер преобразований.

import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<String, String> trim = String::trim;
        Function<String, String> upper = String::toUpperCase;
        Function<String, Integer> len = String::length;
        System.out.println(trim.andThen(upper).andThen(len).apply("  abc "));
    }
}

Быстрая проверка

Что вычисляет f.andThen(g).apply(x)?

Итоги

Вы изучили основные интерфейсы преобразования:

  • Function<T,R> преобразует одно значение с помощью apply.
  • andThen соединяет функции в прямом порядке (g(f(x))); compose — в обратном (f(g(x))).
  • Function.identity() возвращает входное значение.
  • BiFunction<T,U,R> обрабатывает два входных значения и поддерживает andThen, но не compose.

Часто задаваемые вопросы

Урок «Function и BiFunction» бесплатный?

Да — полный текст урока «Function и BiFunction» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Function и BiFunction»?

Функционально преобразуйте значения Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Function и BiFunction»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Function и BiFunction
  2. Supplier и Consumer
  3. Predicate и композиция
  4. Пользовательские функциональные интерфейсы
← Назад к Java Academy