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

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

Ответ

Function<T, R> — это функциональный интерфейс, представляющий функцию, преобразующую один аргумент типа T в результат типа R. Это основа для операций преобразования (mapping) в функциональном стиле.

Сигнатура: R apply(T t)

Ключевые сценарии использования:

  1. Преобразование элементов в Stream API (map):

    List<String> names = List.of("alice", "bob");
    // Function для преобразования строки в верхний регистр
    Function<String, String> toUpperCase = String::toUpperCase;
    List<String> upperNames = names.stream()
                                   .map(toUpperCase)
                                   .toList(); // ["ALICE", "BOB"]
  2. Извлечение данных или вычисление значений:

    Function<Person, String> getName = Person::getName;
    Function<String, Integer> getLength = String::length;
  3. Композиция функций (andThen, compose):

    Function<Integer, Integer> multiplyByTwo = x -> x * 2;
    Function<Integer, Integer> addThree = x -> x + 3;
    // f(x) = (x * 2) + 3
    Function<Integer, Integer> multiplyThenAdd = multiplyByTwo.andThen(addThree);
    // g(x) = (x + 3) * 2
    Function<Integer, Integer> addThenMultiply = multiplyByTwo.compose(addThree);
    
    System.out.println(multiplyThenAdd.apply(5)); // 13
    System.out.println(addThenMultiply.apply(5)); // 16
  4. Использование в других API:

    • Optional.map(): Преобразование значения внутри Optional.
      Optional<String> opt = Optional.of("hello");
      Optional<Integer> lengthOpt = opt.map(String::length); // Optional[5]
    • Collectors.toMap(): Задание функции для ключа и значения.
    • Методы, принимающие Function для гибкой настройки поведения (паттерн Стратегия).