Что такое функциональный интерфейс Function в Java и как он используется?

«Что такое функциональный интерфейс Function в Java и как он используется?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 позволяет инкапсулировать логику преобразования, делая код декларативным, переиспользуемым и удобным для тестирования.