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 — локальная установка не требуется.
Все уроки этого курса
- Function и BiFunction
- Supplier и Consumer
- Predicate и композиция
- Пользовательские функциональные интерфейсы