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 для повышения производительности).