2015-02-19 13 views
5

Ich habe zwei Variablen wie folgt:Welchen Vorteil hat die Verwendung von Methodenreferenzen in diesem Fall?

List<Basket> bigBasket = new ArrayList<>(); Basket basket = new Basket();

ich den folgenden Code schrieb eine Beziehung zwischen den einzelnen Posten in bigBasket und basket hinzuzufügen:

for (Fruit specialFruit : bigBasket.get(0).getFruitInBasket()) { 
    for (Fruit fruit : basket.getFruitInBasket()) { 
     specialFruit.addRelationship(fruit); 
    } 
} 

Jetzt ist das alles in Ordnung, aber IntelliJ inspiziert die Code und angeboten, um es mit der Verwendung einer Methode Referenz zu verbessern, so bekam ich Folgendes:

for (Fruit specialFruit : bigBasket.get(0).getFruitInBasket()) { 
    basket.getFruitInBasket().forEach(specialFruit::addRelationship); 
} 

Also das oben genannte hat weniger Linien aber was ist der eigentliche Vorteil davon? Ich bin nicht ganz auf die Vorteile von Java 8-Funktionen eingegangen, weshalb ich wahrscheinlich nicht wirklich verstehe, was passiert.

Meiner Meinung nach ist die "verbesserte" Version des Codes nicht sehr lesbar im Sinne eines sofortigen Verständnisses dessen, was gegen einen Standard für eine Schleife passiert, vorausgesetzt, Sie haben nicht viel Wissen über Java 8-Funktionen.

Könnte jemand die Vorteile des "verbesserten" Codes gegenüber dem Standard für die Schleife erklären?

EDIT: falsche Verweise auf Lambdas entfernt. Der Code verwendet nur Methodenverweise - nur ein Fachfehler von mir!

+1

Vielleicht ist es nur die Methodenreferenz, die für Sie nicht intuitiv erscheint? Wie wäre es mit 'bigBasket.get (0) .getFruitInBasket(). ForEach (specialFruit -> basket.getFruitInBasket(). ForEach (fruit -> specialFruit.addRelationship (fruit)));'? – Holger

+2

Sicherlich kann ein Idiom für eine Person, die damit nicht vertraut ist, nicht lesbar sein, aber das ist nur eine Binsenwahrheit. Der wirklich relevante Punkt ist folgender: welcher ist für eine Person, die mit * beiden * Idiomen gleichermaßen vertraut ist, besser lesbar? Für mich ist das forEach-Konstrukt viel einfacher, weil es weniger Dinge zu überprüfen gibt, um sicher zu sein, was das Snippet tut. –

Antwort

6

Ich sehe keinen Vorteil in der "verbesserten" Code in Bezug auf die Leistung. Beide Snippets würden über die gesamte basket.getFruitInBasket() Collection iterieren und die exakt gleiche Aktion für jedes Element ausführen.

Den einen Weg über den anderen zu bevorzugen ist einfach Geschmackssache. Meiner Meinung nach drückt die Java-8-Version die Tatsache aus, dass Sie eine einzelne Aktion für alle Elemente der Sammlung übersichtlicher durchführen (vorausgesetzt, Sie sind an Methodenverweise gewöhnt).

BTW, es gibt keinen Lambda-Ausdruck in Ihrem Code, nur eine Methodenreferenz.

Verwandte Themen