Ответ
Function<T, R> — это функциональный интерфейс из пакета java.util.function, представляющий функцию, которая принимает один аргумент типа T и возвращает результат типа R. Он является основой для операций преобразования данных, особенно в Stream API.
Основное использование:
// Определение функции: строка -> её длина
Function<String, Integer> stringLength = s -> s.length();
// Или с reference method
Function<String, Integer> stringLength = String::length;
System.out.println(stringLength.apply("Hello")); // Вывод: 5
Композиция функций: Интерфейс предоставляет методы andThen и compose для создания цепочек преобразований.
Function<Integer, Integer> multiplyByTwo = x -> x * 2;
Function<Integer, Integer> addThree = x -> x + 3;
// andThen: сначала apply исходной функции, затем переданной
Function<Integer, Integer> multiplyThenAdd = multiplyByTwo.andThen(addThree);
System.out.println(multiplyThenAdd.apply(5)); // Вывод: 13 (5*2 + 3)
// compose: сначала apply переданной функции, затем исходной
Function<Integer, Integer> addThenMultiply = multiplyByTwo.compose(addThree);
System.out.println(addThenMultiply.apply(5)); // Вывод: 16 ((5+3) * 2)
Использование в Stream API: Метод map принимает Function для преобразования элементов потока.
List<String> names = List.of("Alice", "Bob", "Charlie");
List<Integer> lengths = names.stream()
.map(String::length) // Function<String, Integer>
.collect(Collectors.toList()); // [5, 3, 7]
Практическое значение: Function позволяет инкапсулировать логику преобразования, делая код декларативным, переиспользуемым и удобным для тестирования.