Что такое ссылка на метод в Java и как она используется?
Что проверяют
Владеете ли вы функциональной частью языка на уровне повседневного кода, а не на уровне слова «лямбда». Заодно проверяют понимание функциональных интерфейсов: ссылка на метод не самостоятельное значение, её тип задаёт контекст, в который её подставили.
Как отвечать
Ссылка на метод это сокращённая запись лямбды, которая не делает ничего, кроме вызова уже существующего метода. Компилятор сопоставляет сигнатуру метода с единственным абстрактным методом целевого функционального интерфейса.
Форм четыре:
Integer::parseInt // статический метод
System.out::println // метод конкретного объекта
String::toUpperCase // метод получателя, который придет аргументом
ArrayList::new // конструкторТретью форму стоит проговорить отдельно, она самая неочевидная: String::toUpperCase эквивалентна s -> s.toUpperCase(), первый параметр становится получателем вызова. Внутри класса доступна ещё и форма super::method.
List<String> sorted = names.stream()
.map(String::toUpperCase)
.sorted(Comparator.comparing(String::length))
.toList();Выигрыш не только в краткости: имя метода читается как намерение, а типы компилятор выводит сам из целевого интерфейса.
Где спотыкаются
Не видят третьей формы и заводят собственный статический метод-обёртку там, где хватило бы ссылки на метод самого типа.
Забывают, что в форме obj::method выражение слева вычисляется один раз, в момент создания ссылки. Если поле потом переприсвоят, ссылка продолжит работать со старым объектом, а если оно было null, NullPointerException прилетит сразу при создании ссылки, а не при вызове.
Пытаются втиснуть ссылку туда, где нужна лямбда: переставить аргументы, подставить константу, добавить проверку. Как только требуется хоть что-то помимо голого вызова, пишется лямбда, и это не признак слабого кода.