Ответ
Оператор :: (ссылка на метод) в Java 8+ позволяет создавать компактные лямбда-выражения, ссылаясь на существующие методы. Существует четыре основных вида ссылок:
-
Ссылка на статический метод Синтаксис:
ClassName::staticMethodName// Эквивалентно: (str) -> Integer.parseInt(str) Function<String, Integer> parser = Integer::parseInt; Integer result = parser.apply("123"); // 123 -
Ссылка на метод экземпляра конкретного объекта Синтаксис:
objectInstance::instanceMethodNameString prefix = "Hello, "; // Эквивалентно: (name) -> prefix.concat(name) Function<String, String> greeter = prefix::concat; System.out.println(greeter.apply("World")); // Hello, World -
Ссылка на метод экземпляра произвольного объекта определенного типа Синтаксис:
ClassName::instanceMethodName// Эквивалентно: (str) -> str.toUpperCase() Function<String, String> toUpper = String::toUpperCase; // Эквивалентно: (list, element) -> list.add(element) BiConsumer<List<String>, String> adder = List::add; -
Ссылка на конструктор Синтаксис:
ClassName::new// Эквивалентно: () -> new ArrayList<>() Supplier<List<String>> listSupplier = ArrayList::new; // Эквивалентно: (capacity) -> new ArrayList<>(capacity) IntFunction<ArrayList<String>> listWithCapacity = ArrayList::new;
Ключевое преимущество: Повышение читаемости кода и явное указание на используемый метод, что часто предпочтительнее анонимных лямбда-выражений.