Интерфейс Function в Java - Вопросы
Всего: 5 вопросов
1. Основное назначение функционального интерфейса java.util.function.Function.
Основное назначение функционального интерфейса java.util.function.Function.
Интерфейс Function<T, R> предназначен для преобразования (mapping): он принимает аргумент типа T и возвращает результат типа R — того же или другого типа. Единственный абстрактный метод — R apply(T t), функциональный дескриптор — T -> R. Типичные задачи: String в Integer, сущность в DTO, число в отформатированную строку.
2. Напишите лямбда-выражение, которое с помощью интерфейса java.util.function.Function преобразует объект Exam в объект String:
public class Exam {
private String name;
private String version;
public Exam(String name, String version) {
this.name = name;
this.version = version;
}
public String getName() {
return name;
}
public String getVersion() {
return version;
}
}
Напишите лямбда-выражение, которое с помощью интерфейса java.util.function.Function преобразует объект Exam в объект String:
public class Exam {
private String name;
private String version;
public Exam(String name, String version) {
this.name = name;
this.version = version;
}
public String getName() {
return name;
}
public String getVersion() {
return version;
}
}Тип аргумента — Exam, тип результата — String, поэтому объявление выглядит так:
Function<Exam, String> converter = e -> e.getName() + " " + e.getVersion();
System.out.println(converter.apply(new Exam("Java Core", "8"))); // Java Core 8
System.out.println(converter.apply(new Exam("Java Core", "21"))); // Java Core 21
3. Методы по умолчанию (default) интерфейса Function.
Методы по умолчанию (default) интерфейса Function.
У интерфейса Function два метода по умолчанию — andThen() и compose(); оба склеивают функции в цепочку и возвращают новую функцию:
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after)
default <V> Function<V, R> compose(Function<? super V, ? extends T> before)
Оба метода бросают NullPointerException, если передать им null: внутри стоит Objects.requireNonNull.
4. Разница между методами compose и andThen интерфейса Function.
Разница между методами compose и andThen интерфейса Function.
Метод compose сначала применяет функцию, переданную параметром, и её результат подаёт на вход текущей функции: f.compose(g) равнозначно x -> f.apply(g.apply(x)). Метод andThen наоборот: сначала выполняется функция, у которой вызван метод, а её результат передаётся в функцию-параметр: f.andThen(g) равнозначно x -> g.apply(f.apply(x)). Отсюда правило эквивалентности: g.compose(f) — это то же самое, что f.andThen(g).
5. Статический метод интерфейса Function.
Статический метод интерфейса Function.
У интерфейса Function один статический метод — identity():
static <T> Function<T, T> identity()
Он возвращает функцию, которая отдаёт свой аргумент без изменений (тождественное преобразование T -> T). Пригождается там, где API требует функцию, а нужен исходный объект «как есть», например Collectors.toMap(Function.identity(), String::length).