Lambda-Ausdruck oder Methodenreferenz? [geschlossen]

8

Ich habe in einem Buch gelesen (Fischer Java Closures und Lambda , Apress 2015), dass Methodenreferenzen den Lambda-Ausdrücken vorzuziehen sind. Aus meiner Sicht ist der Lambda-Ausdruck für Entwickler, die andere Sprachen verwenden, leichter verständlich. Warum heißt es dann, dass die Methodenreferenz vorzuziehen ist? Ist das Schreiben eines Lambda-Ausdrucks eine schlechte Übung in Java 8?

    
zawhtut 17.04.2015, 02:41
quelle

1 Antwort

15

Im Abschnitt Lambda Best Practices von Kapitel 2 heißt es in Fischer's Buch:

  

Verwenden Sie so weit wie möglich eine Methodenreferenz anstelle von Lambda. Methodenreferenzen sind nicht nur kürzer und einfacher zu lesen, sondern durch die Verwendung von Methodenreferenzen werden Sie direkt über die Methoden als Werte nachdenken. Dies ist der Code, den Sie aus Ihrer Codebasis und Ihrem Gehirn entfernen müssen:

%Vor%
  

Wenn Sie diesen Code natürlich schreiben, dann haben Sie immer noch nicht den Sprung gemacht, auf der höheren Ebene der funktionalen Programmierung zu denken. Sobald Sie diesen Sprung gemacht haben, wird es viel einfacher, mit komplexen Funktionen zu kommunizieren und zu arbeiten, weil Sie in Typen denken, nicht in Werten.

Obwohl ich der Schlussfolgerung größtenteils zustimme, bin ich nicht sicher, ob ich Fischers Argumentation kaufe. Methodenreferenzen sind oft, wenn auch nicht immer, kürzer als das ausgeschriebene Lambda. Im ersten Teil sagt er, dass Methodenreferenzen Ihnen helfen werden, über Methoden als Werte nachzudenken. OK, aber später sagt er, dass die Dinge leichter werden, weil du in Typen denkst, nicht in Werten. Ich bin mir nicht sicher, was das bedeutet.

Es ist möglich, den Beispielausdruck, den er angibt, als

neu zu schreiben %Vor%

Das ist sicherlich kürzer als das Original, aber es ist schwer aus einem winzigen Beispiel zu verallgemeinern.

Hier sind meine Methodenreferenzen im Vergleich zu ausgeschriebenen Lambdas.

Wenn zwischen der Verwendung eines Lambda-Ausdrucks und einer Methodenreferenz gewählt werden kann, ist oft der Fall, dass eine Methodenreferenz vorzuziehen ist. Aber dies ist keine feste Regel, und es gibt wahrscheinlich Umstände, in denen ein Lambda-Ausdruck vorzuziehen ist. Es ist auch eine Frage des Geschmacks.

Wenn Sie mit Lambda-Ausdrücken aus anderen Sprachen vertraut sind, werden Lambda-Ausdrücke in Java wahrscheinlich schneller bekannt sein als Methodenreferenzen. Ich glaube jedoch, dass dies ein vorübergehender Zustand ist, bis Sie Methodenverweise lernen. Sobald sie vertrauter sind, können die Vorteile von Methodenreferenzen die ursprüngliche Fremdheit überwiegen.

Betrachten Sie dieses einfache Beispiel, um die Länge von Strings zu erhalten:

%Vor%

In diesem Fall entspricht die Größe des Lambda-Ausdrucks ungefähr der Größe der Methodenreferenz (in der Anzahl der Zeichen). Beachten Sie jedoch, dass die Methodenreferenz mehr Typinformationen enthält. Es weist den Leser darauf hin, dass der Elementtyp String ist, was beim Verständnis einer langen Pipeline hilfreich sein kann. Manchmal ist es auch für den Compiler hilfreich, wenn er nicht auf den Elementtyp schließen kann, wie es manchmal in komplexen Ausdrücken vorkommt.

Ein weiterer Punkt ist, dass die Verwendung einer Methodenreferenz Sie oft von der Verantwortung befreit, einen Namen für einen formalen Parameter zu finden, der einfach an eine andere Methode übergeben wird. Benennung ist oft wichtig, aber Lambda-Formale sind oft "Müll" -Namen wie i x oder s wie in diesem Beispiel.

Die Methodenreferenz ist ein kleines bisschen effizienter, da sie keine statische Methode generieren muss, die aufgerufen werden muss, um zur String.length () -Methode zu gelangen. Aber diese Effizienz ist selten eine wichtige Überlegung.

Betrachten Sie auch dieses Beispiel, absichtlich des Kontexts beraubt:

%Vor%

Ist diese Zeichenfolge Verkettung oder numerische Addition? Wenn numerisch, welcher Typ? Nach den Regeln der Sprache muss dies zur Kompilierzeit bekannt sein, sonst ist es ein Fehler. Obwohl es dem Compiler klar sein könnte, ist dies manchmal dem Leser nicht sehr klar. Betrachten Sie stattdessen diese Methodenreferenzen:

%Vor%

Die Verwendung eines Namens für die Operation in diesem Fall macht den Leser sehr deutlich, was beabsichtigt ist.

    
Stuart Marks 18.04.2015 06:02
quelle

Tags und Links