Ответ 1
Как и в текущей реализации JRE, Function.identity()
всегда будет возвращать один и тот же экземпляр, в то время как каждое вхождение identifier -> identifier
не только создаст свой собственный экземпляр, но даже будет иметь отдельный класс реализации. Подробнее см. здесь.
Причина заключается в том, что компилятор генерирует синтетический метод, содержащий тривиальное тело этого лямбда-выражения (в случае x->x
, эквивалентное return identifier;
), и сообщает исполняющей среде создать реализацию функционального интерфейса, вызывающего это метод. Таким образом, среда выполнения видит только разные целевые методы, и текущая реализация не анализирует методы, чтобы выяснить, являются ли определенные методы эквивалентными.
Поэтому использование Function.identity()
вместо x -> x
может сэкономить некоторую память, но это не должно принимать ваше решение, если вы действительно считаете, что x -> x
более читабельно, чем Function.identity()
.
Вы также можете подумать, что при компиляции с включенной информацией об отладке синтетический метод будет иметь атрибут отладки линии, указывающий на строку исходного кода, содержащую лямбда-выражение, поэтому у вас есть шанс найти источник определенного Function
при отладке. В отличие от этого, когда вы сталкиваетесь с экземпляром, возвращаемым Function.identity()
во время отладки операции, вы не знаете, кто вызвал этот метод и передал экземпляр операции.