Ab der aktuellen JRE-Implementierung Function.identity()wird immer dieselbe Instanz zurückgegeben, während bei jedem Auftreten von identifier -> identifiernicht 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 -> xverwenden, sparen Sie möglicherweise Speicherplatz, aber das sollte Ihre Entscheidung nicht beeinflussen, wenn Sie der Meinung sind, dass dies x -> xbesser 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 FunctionInstanz 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.