Gymterview
junior

Для чего нужны функциональные интерфейсы Function, DoubleFunction, IntFunction и LongFunction?

Function<T, R> — функциональный интерфейс, представляющий функцию, которая принимает аргумент типа T и возвращает результат типа R. Основной метод — apply(T t). Интерфейс предоставляет default-методы compose() и andThen() для построения цепочек преобразований.

Пример
Function<String, Integer> toInteger = Integer::valueOf;
Function<String, String> backToString = toInteger.andThen(String::valueOf);
backToString.apply("123"); // "123"

Примитивные специализации позволяют избежать автобоксинга при работе с числовыми типами:

Интерфейс Вход Выход
Function<T, R> T R
DoubleFunction<R> double R
IntFunction<R> int R
LongFunction<R> long R

Метод andThen() позволяет выстроить конвейер: результат первой функции передаётся на вход второй. Метод compose() работает в обратном порядке — сначала выполняется переданная функция, затем текущая.

На собеседовании: помимо определения, стоит упомянуть compose и andThen, а также объяснить, зачем существуют примитивные специализации (избежание autoboxing для повышения производительности).