Интерфейс Function в Java - Вопросы

Всего: 5 вопросов

1. 

Основное назначение функционального интерфейса 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;
    }
}

Тип аргумента — 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.

У интерфейса 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 сначала применяет функцию, переданную параметром, и её результат подаёт на вход текущей функции: 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 один статический метод — identity():

static <T> Function<T, T> identity()

Он возвращает функцию, которая отдаёт свой аргумент без изменений (тождественное преобразование T -> T). Пригождается там, где API требует функцию, а нужен исходный объект «как есть», например Collectors.toMap(Function.identity(), String::length).

Страница 1 из 1