🍒 Магия двойного двоеточия: 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❤2