Назад к вопросам
Junior
94
questionbank

Для чего используется функциональный интерфейс BiFunction<T, U, R> в Java?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

BiFunction<T, U, R> используется для представления функции, которая принимает два аргумента типов T и U, и возвращает результат типа R. Это специальный функциональный интерфейс из пакета java.util.function.

Его абстрактный метод имеет следующую сигнатуру:

// Представляет функцию, которая принимает два аргумента и выдает результат.
// @since 1.8
public interface BiFunction<T, U, R> {

    // Применяет эту функцию к заданным аргументам.
    // @param t первый аргумент функции
    // @param u второй аргумент функции
    // @return результат применения функции
    R apply(T t, U u);

    // Возвращает составную функцию, которая сначала применяет эту функцию к входным данным1
    // и входным данным2, а затем применяет функцию after к результату.
    // Если оценка любого из выражений выдает исключение, оно передается далее вызывающему.
    // @param after функция, применяемая после этой функции
    // @throws NullPointerException если after равно null
    // @return составная функция, которая сначала применяет эту функцию
    //         а затем применяет функцию after
    default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t, U u) -> after.apply(apply(t, u));
    }
}

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

  • Агрегация и комбинирование данных: Объединение или расчет значения на основе двух входных данных.
  • Применение логики к двум элементам: Выполнение операции, требующей двух аргументов.
  • Использование в потоках (Streams): В операциях типа reduce или collect, где требуется комбинировать элементы попарно.

Пример использования:

// Пример BiFunction для сложения двух целых чисел
BiFunction<Integer, Integer, Integer> sum = (a, b) -> a + b;

// Использование BiFunction
int result = sum.apply(5, 3); // result будет 8

System.out.println(result);

Еще один пример с использованием andThen:

// Пример BiFunction для сложения двух чисел
BiFunction<Integer, Integer, Integer> adder = (a, b) -> a + b;

// Пример Function для преобразования результата сложения в строку
Function<Integer, String> toStringConverter = i -> "Result: " + i;

// Использование andThen для комбинирования BiFunction и Function
BiFunction<Integer, Integer, String> composedFunction = adder.andThen(toStringConverter);

// Применение составной функции
String finalResult = composedFunction.apply(10, 20); // finalResult будет "Result: 30"

System.out.println(finalResult);

BiFunction обеспечивает компактный и читаемый способ передачи поведения (в виде функции) в методы или классы, требующие работы с двумя входными параметрами.