Zum aktuellen JRE-Setup gibt Function.identity()
stets die gleiche Instanz zurück, während jedes Vorkommen von identifier -> identifier
nicht nur seine eigene Instanz erstellt, sondern sogar eine eigene Implementierungsklasse hat. Für weitere Details siehe hier.
Der Grund dafür ist, dass der Compiler eine synthetische Methode generiert, die den banalen Körper des Lambda-Ausdrucks enthält (im Fall von x->x
, äquivalent zu return identifier;
) und zur Laufzeit die Erstellung einer Implementierung des funktionalen Interface aufruft, die diese Methode aufruft. Daher sieht das Laufzeitsystem nur unterschiedliche Zielmethoden, und die aktuelle Implementierung analysiert nicht die Methoden, um festzustellen, ob bestimmte Methoden äquivalent sind.
Die Verwendung von Function.identity()
anstelle von x -> x
könnte also etwas Speicher sparen, aber das sollte nicht Ihre Entscheidung beeinflussen, wenn Sie wirklich der Meinung sind, dass x -> x
lesbarer ist als Function.identity()
.
Sie sollten auch bedenken, dass beim Kompilieren mit aktivierten Debug-Informationen die synthetische Methode ein Linien-Debug-Attribut haben wird, das auf die Quellcodezeile(n) zeigt, die den Lambda-Ausdruck enthalten. Daher haben Sie die Möglichkeit, die Quelle einer bestimmten Function
-Instanz während des Debuggens zu finden. Im Gegensatz dazu, wenn Sie während des Debuggens einer Operation auf die von Function.identity()
zurückgegebene Instanz stoßen, werden Sie nicht wissen, wer diese Methode aufgerufen hat und die Instanz an die Operation übergeben hat.