🚀 Функциональные интерфейсы: Level Up
В первой части мы разобрали «Великолепную четверку» (
Для этого в Java есть Bi-версии и Операторы.
👯 Семейство «Bi» (Два аргумента)
Стандартные интерфейсы принимают только один параметр. Если вам нужно обработать пару значений (например, ключ и значение из Map), используйте приставку
1. BiPredicate
💙 Метод:
💙 Пример: Проверить, что длина строки
2. BiConsumer
💙 Метод:
💙 Пример:
3. BiFunction
💙 Метод:
💙 Пример: Сложить число
🔄 Семейство «Operator» (Один и тот же тип)
Часто бывает, что вы преобразуете объект, не меняя его тип (String -> String, int -> int). Писать
1. UnaryOperator
💙 Наследник
💙 Пример:
2. BinaryOperator
💙 Наследник
💙 Пример:
⚡ Осторожно с боксингом!
Дженерики (
Для примитивов есть свои спецназовцы:
💙
💙 Правило: Если работаете с числами - всегда ищите примитивный аналог интерфейса.
💻 Пример в коде
🔥 Итог
💙 Нужно 2 аргумента? Ищите Bi.
💙 Тип входа и выхода совпадает? Ищите Operator.
💙 Работаете с
#Java #AdvancedJava #FunctionalProgramming
📲 Мы в MAX
👉@BookJava
В первой части мы разобрали «Великолепную четверку» (
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
}
}
🔥 Итог
int/long/double? Ищите интерфейсы с префиксом типа.#Java #AdvancedJava #FunctionalProgramming
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
🍒 Магия двойного двоеточия: Method References
Мы уже научились писать лямбды. Но иногда даже лямбда кажется слишком громоздкой. Если ваша лямбда не делает ничего, кроме вызова одного уже существующего метода, Java позволяет использовать Method Reference (ссылку на метод).
Синтаксис простой:
🛠 4 ситуации, когда это работает
Есть 4 основных способа использовать оператор
1. Ссылка на статический метод
💙 Лямбда:
💙 Reference:
💙 Суть: Просто перенаправляем входящий параметр в статический метод.
2. Ссылка на метод конкретного объекта
💙 Лямбда:
💙 Reference:
💙 Суть: У нас уже есть готовый объект (System.out), и мы вызываем его метод для каждого элемента.
3. Ссылка на метод произвольного объекта определенного типа (Самый хитрый пункт! 🤯)
💙 Лямбда:
💙 Reference:
💙 Суть: Здесь метод вызывается у самого объекта, который пришел в лямбду. Хотя синтаксис похож на статический вызов, это вызов инстанс-метода.
4. Ссылка на конструктор
💙 Лямбда:
💙 Reference:
💙 Суть: Используется для создания новых объектов (часто в Stream API:
💻 Пример: Было vs Стало
Смотрите, как очищается код. Допустим, у нас есть список имен:
🧠 Как понять, когда использовать?
Если ваша лямбда выглядит так:
или
...смело меняйте её на
Но! Если вам нужно изменить аргумент перед передачей (например,
#Java #CleanCode #MethodReference
📲 Мы в MAX
👉@BookJava
Мы уже научились писать лямбды. Но иногда даже лямбда кажется слишком громоздкой. Если ваша лямбда не делает ничего, кроме вызова одного уже существующего метода, Java позволяет использовать Method Reference (ссылку на метод).
Синтаксис простой:
Класс::метод (без скобок!).🛠 4 ситуации, когда это работает
Есть 4 основных способа использовать оператор
::. Важно понимать разницу, чтобы не путаться.1. Ссылка на статический метод
s -> Integer.parseInt(s)Integer::parseInt2. Ссылка на метод конкретного объекта
obj -> System.out.println(obj)System.out::println3. Ссылка на метод произвольного объекта определенного типа (Самый хитрый пункт! 🤯)
s -> s.toLowerCase()String::toLowerCase4. Ссылка на конструктор
() -> new ArrayList<>()ArrayList::newCollectors.toCollection(ArrayList::new)).💻 Пример: Было vs Стало
Смотрите, как очищается код. Допустим, у нас есть список имен:
List<String> names = Arrays.asList("Alex", "Bob", "Anna");
// ❌ Уровень 1: Анонимный класс (Олдскул)
names.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
// ⚠️ Уровень 2: Обычная лямбда
names.forEach(s -> System.out.println(s));
// ✅ Уровень 3: Method Reference (Красота)
names.forEach(System.out::println);
🧠 Как понять, когда использовать?
Если ваша лямбда выглядит так:
x -> Class.method(x)или
x -> x.method()...смело меняйте её на
::.Но! Если вам нужно изменить аргумент перед передачей (например,
x -> System.out.println("Name: " + x)), то Method Reference уже не подойдет, оставайтесь на лямбде.#Java #CleanCode #MethodReference
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3