Java Разработка | Spring Boot Backend & Architecture. Программирование на Джава для Developer. IT Собеседования, Алгоритмы и Coding задачи. Уроки и курсы для роста в Tech.

@bookjava
Фото 🚀 Функциональные интерфейсы: Level Up В первой части мы разобрали «Великолепную четверку» (Predicate, Consumer, Supplier, Function). Но что делать, если нужно принять два аргумента? Или если тип входа и выхода совпадает, и лень писать лишний код? Для этого в Java есть Bi-версии и Операторы. 👯 Семейство «Bi» (Два аргумента) Стандартные интерфейсы принимают только один параметр. Если вам нужно обработать пару значений (например, ключ и значение из Map), используйте приставку Bi. 1. BiPredicate <T, U> 💙 Метод: boolean test(T t, U u) 💙 Пример: Проверить, что длина строки T больше числа U. 2. BiConsumer <T, U> 💙 Метод: void accept(T t, U u) 💙 Пример: map.forEach((k, v) -> ...) - классический пример использования. 3. BiFunction <T, U, R> 💙 Метод: R apply(T t, U u) 💙 Пример: Сложить число T и число U, получить результат R. 🔄 Семейство «Operator» (Один и тот же тип) Часто бывает, что вы преобразуете объект, не меняя его тип (String -> String, int -> int). Писать Function<String, String> - слишком длинно. 1. UnaryOperator <T> 💙 Наследник Function<T, T>. 💙 Пример: str -> str.toUpperCase() (принимает строку, возвращает строку). 2. BinaryOperator <T> 💙 Наследник BiFunction<T, T, T>. 💙 Пример: (a, b) -> a + b (два числа на вход, одно число на выход). Именно он используется в Stream.reduce. ⚡ Осторожно с боксингом! Дженерики (<T>) работают только с объектами. Если вы используете Function<Integer, Integer> для математики, Java будет постоянно распаковывать и запаковывать int в Integer, что бьет по производительности. Для примитивов есть свои спецназовцы: 💙 IntPredicate, LongConsumer, DoubleFunction и т.д. 💙 Правило: Если работаете с числами - всегда ищите примитивный аналог интерфейса. 💻 Пример в коде import java.util.function.*; public class AdvancedLambdas { public static void main(String[] args) { // 1. BinaryOperator: объединяем две строки BinaryOperator<String> concat = (s1, s2) -> s1 + " " + s2; System.out.println(concat.apply("Hello", "Java")); // 2. BiPredicate: проверяем, начинается ли строка с префикса BiPredicate<String, String> startsWith = (str, prefix) -> str.startsWith(prefix); System.out.println(startsWith.test("Telegram", "Tele")); // true // 3. IntUnaryOperator: работаем с примитивами без лишних объектов IntUnaryOperator square = x -> x * x; System.out.println(square.applyAsInt(5)); // 25 } } 🔥 Итог 💙 Нужно 2 аргумента? Ищите Bi. 💙 Тип входа и выхода совпадает? Ищите Operator. 💙 Работаете с int/long/double? Ищите интерфейсы с префиксом типа. #Java #AdvancedJava #FunctionalProgramming 👉 @BookJava
Если у вас установлено приложение,
вы можете сразу перейти в канал