Это просто синтаксический сахар для анонимной реализации или лямбда с закрытием (ссылаясь на состояние вне определения, в вашем случае экземпляр methodReference
). Ссылки на методы и лямбды обрабатываются одинаково в этом отношении. Так что такое же распределение памяти на самом деле.
Использование ссылок на методы (или лямбды) возможно, когда в интерфейсе есть только один нестатический метод , и сигнатура этого метода совпадает с сигнатурой лямбды или ссылки на метод. В этом случае компилятор будет знать, как обернуть его, и поэтому он будет назначаться. Не имеет значения, является ли это одним из «стандартных» интерфейсов, таких как Function
, Consumer
или Supplier
или пользовательским, это должен быть функциональный интерфейс, вот и все.
Ниже цитируется из официальной документации Oracle по Java :
Arrays.sort(rosterAsArray, Person::compareByAge);
Ссылка на метод Person::compareByAge
семантически совпадает с лямбда-выражением (a, b) -> Person.compareByAge(a, b)
. Каждый имеет следующие характеристики:
- Его список формальных параметров скопирован с Comparator.compare, который (Person, Person).
- Его тело вызывает метод Person.compareByAge.