Ich habe kürzlich den Lambda-Ausdruck beherrscht, der in Java 8 eingeführt wurde. Wenn ich eine Funktionsschnittstelle verwende, verwende ich normalerweise immer einen Lambda-Ausdruck, anstatt eine Klasse zu erstellen, die die Funktionsschnittstelle implementiert.
Wird dies als gute Praxis angesehen? Oder sind ihre Situationen, in denen die Verwendung eines Lambda für eine funktionale Schnittstelle nicht angemessen ist?
Antworten:
Es gibt eine Reihe von Kriterien, anhand derer Sie erwägen sollten, kein Lambda zu verwenden:
priceIsOver100
.x -> x.price > 100
ist genauso klar wie dieser Name. Ich meine, solche NamenisEligibleVoter
ersetzen eine lange Liste von Bedingungen.Gehen Sie nicht über Bord. Denken Sie daran, dass die Software leicht geändert werden kann. Wenn Sie Zweifel haben, schreiben Sie es in beide Richtungen und sehen Sie, welche leichter zu lesen sind.
quelle
Es hängt davon ab, ob. Immer wenn Sie feststellen, dass Sie dasselbe Lambda an verschiedenen Stellen verwenden, sollten Sie eine Klasse implementieren, die die Schnittstelle implementiert. Aber wenn du sonst eine anonyme innere Klasse benutzt hättest, denke ich, dass ein Lambda weitaus besser ist.
quelle
Ich unterstütze die Antwort von Karl Bielefeldt, möchte aber kurz ergänzen.
quelle
Zugriff auf lokale Variablen des einschließenden Gültigkeitsbereichs
Die akzeptierte Antwort von Karl Bielefeldt ist richtig. Ich kann noch einen Unterschied machen:
Der Lambda-Code, der in einer Methode innerhalb einer Klasse verschachtelt ist, kann auf alle effektiv endgültigen Variablen zugreifen , die in dieser Methode und Klasse gefunden wurden.
Durch das Erstellen einer Klasse, die die Funktionsschnittstelle implementiert, erhalten Sie keinen direkten Zugriff auf den Status des aufrufenden Codes.
So zitieren Sie das Java-Tutorial (Hervorhebung von mir):
Das Herausziehen und Benennen von langem Code hat also Vorteile, aber Sie müssen dies gegen die Einfachheit des direkten Zugriffs auf den Status der einschließenden Methode und Klasse abwägen.
Sehen:
quelle
Das mag ein Trottel sein, aber zu all den anderen hervorragenden Punkten, die in anderen Antworten gemacht wurden, möchte ich hinzufügen:
Bevorzugen Sie nach Möglichkeit Methodenreferenzen . Vergleichen Sie:
gegen
Wenn Sie eine Methodenreferenz verwenden, müssen Sie die Argumente des Lambda nicht mehr benennen, da diese normalerweise redundant sind und / oder zu faulen Namen wie
e
oder führenx
.quelle
Aufbauend auf der Antwort von Matt McHenry kann es eine Beziehung zwischen Lambda und Methodenreferenzen geben, wobei das Lambda als eine Reihe von Methodenreferenzen umgeschrieben werden kann. Zum Beispiel:
vs
quelle