Ab der aktuellen JRE-Implementierung Function.identity()
wird immer dieselbe Instanz zurückgegeben, während bei jedem Auftreten von identifier -> identifier
nicht nur eine eigene Instanz erstellt wird, sondern sogar eine eigene Implementierungsklasse vorhanden ist. Weitere Details finden Sie hier .
Der Grund dafür ist, dass der Compiler eine synthetische Methode generiert, die den Trivialkörper dieses Lambda-Ausdrucks enthält (im Fall von x->x
äquivalent zu return identifier;
) und die Laufzeit anweist, eine Implementierung der funktionalen Schnittstelle zu erstellen, die diese Methode aufruft. Die Laufzeit sieht also nur unterschiedliche Zielmethoden und die aktuelle Implementierung analysiert die Methoden nicht, um herauszufinden, ob bestimmte Methoden gleichwertig sind.
Wenn Sie also Function.identity()
anstelle von x -> x
verwenden, sparen Sie möglicherweise Speicherplatz, aber das sollte Ihre Entscheidung nicht beeinflussen, wenn Sie der Meinung sind, dass dies x -> x
besser lesbar ist als Function.identity()
.
Sie können auch berücksichtigen, dass die synthetische Methode beim Kompilieren mit aktivierten Debug-Informationen ein Zeilen-Debug-Attribut aufweist, das auf die Quellcode-Zeile (n) verweist, in denen sich der Lambda-Ausdruck befindet. Daher haben Sie die Möglichkeit, die Quelle einer bestimmten Function
Instanz beim Debuggen zu finden . Wenn Sie dagegen auf die Instanz stoßen, die Function.identity()
beim Debuggen einer Operation zurückgegeben wurde, wissen Sie nicht, wer diese Methode aufgerufen und die Instanz an die Operation übergeben hat.