На какие виды методов можно ссылаться с помощью оператора `::` (method reference) в Java?

«На какие виды методов можно ссылаться с помощью оператора `::` (method reference) в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оператор :: (ссылка на метод) в Java 8+ позволяет создавать компактные лямбда-выражения, ссылаясь на существующие методы. Существует четыре основных вида ссылок:

  1. Ссылка на статический метод Синтаксис: ClassName::staticMethodName

    // Эквивалентно: (str) -> Integer.parseInt(str)
    Function<String, Integer> parser = Integer::parseInt;
    Integer result = parser.apply("123"); // 123
  2. Ссылка на метод экземпляра конкретного объекта Синтаксис: objectInstance::instanceMethodName

    String prefix = "Hello, ";
    // Эквивалентно: (name) -> prefix.concat(name)
    Function<String, String> greeter = prefix::concat;
    System.out.println(greeter.apply("World")); // Hello, World
  3. Ссылка на метод экземпляра произвольного объекта определенного типа Синтаксис: ClassName::instanceMethodName

    // Эквивалентно: (str) -> str.toUpperCase()
    Function<String, String> toUpper = String::toUpperCase;
    // Эквивалентно: (list, element) -> list.add(element)
    BiConsumer<List<String>, String> adder = List::add;
  4. Ссылка на конструктор Синтаксис: ClassName::new

    // Эквивалентно: () -> new ArrayList<>()
    Supplier<List<String>> listSupplier = ArrayList::new;
    // Эквивалентно: (capacity) -> new ArrayList<>(capacity)
    IntFunction<ArrayList<String>> listWithCapacity = ArrayList::new;

Ключевое преимущество: Повышение читаемости кода и явное указание на используемый метод, что часто предпочтительнее анонимных лямбда-выражений.