Rückgabe von Lambda forEach () in Java
Ich versuche mich zu ändern, einige for-each-Schleifen zu lambda forEach()
-Methoden zu entdecken, die Möglichkeiten des lambda-Ausdrücke. Die followong möglich zu sein scheint:
ArrayList<Player> playersOfTeam = new ArrayList<Player>();
for (Player player : players) {
if (player.getTeam().equals(teamName)) {
playersOfTeam.add(player);
}
}
Mit lambda forEach()
players.forEach(player->{if (player.getTeam().equals(teamName)) {playersOfTeam.add(player);}});
Aber der nächste doesen ' T work:
for (Player player : players) {
if (player.getName().contains(name)) {
return player;
}
}
mit lambda
players.forEach(player->{if (player.getName().contains(name)) {return player;}});
Gibt es etwas falsch in der syntax der letzten Zeile oder ist es unmöglich, die Rendite von forEach()
Methode?
InformationsquelleAutor der Frage samutamm | 2014-05-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
return
es ist die Rückkehr aus dem lambda-Ausdruck als vielmehr von den mit Methode. StattforEach
müssen Siefilter
stream:Hier
filter
beschränkt den stream auf diejenigen Elemente, die mit dem Prädikat, undfindFirst
gibt dann einOptional
mit dem ersten passenden Eintrag.Sieht dies weniger effizient als die for-loop-Ansatz, aber in der Tat
findFirst()
können Kurzschluss - generiert er nicht den gesamten gefilterten stream extrahieren und dann ein element aus, sondern filtert nur so viele Elemente, wie es erforderlich ist, um das erste passende. Sie können auchfindAny()
stattfindFirst()
wenn Sie nicht unbedingt interessieren immer die ersten passenden Spieler aus der (bestellten) stream aber einfach keine passenden Artikel. Dies ermöglicht eine bessere Effizienz, wenn es Parallelität beteiligt.InformationsquelleAutor der Antwort Ian Roberts
Ich schlage vor, Sie zuerst zu verstehen versuchen, Java 8 in das ganze Bild, vor allem in deinem Fall wird es streams lambdas und Methode verweist.
Sollten Sie nie konvertieren Sie vorhandenen code, um Java-8-code auf einer line-by-line-basis, sollten Sie extrahieren Sie Eigenschaften und wandeln diese.
Was ich ermittelt in Ihrem ersten Fall ist der folgende:
Lassen Sie uns sehen, wie wir das machen, wir können es mit dem folgenden:
Was Sie hier tun, ist:
Collection<Player>
sind, haben Sie jetztStream<Player>
.Predicate<Player>
mapping jeder Spieler, der boolean true, wenn das gewünscht wird, gehalten werden.Collector
hier können wir mit einer der standard-Bibliothek für Sammler, dieCollectors.toList()
.Diese enthält auch zwei andere Punkte:
List<E>
überArrayList<E>
.new ArrayList<>()
Sie sind mit Java 8, nachdem alle.Nun auf Ihrem zweiten Punkt:
Du wieder konvertieren wollen etwas von legacy-Java, Java 8, ohne Blick auf das größere Bild. Dieser Teil ist schon beantwortet @IanRobertsobwohl ich denke, dass Sie tun müssen
players.stream().filter(...)...
über das, was er vorgeschlagen hat.InformationsquelleAutor der Antwort skiwi
Das, was mir geholfen:
Entnommen Java 8 die Suche nach Bestimmten Element in der Liste mit Lambda
InformationsquelleAutor der Antwort user5495300
Wenn Sie möchten, um einen booleschen Wert zurück, dann kann man so etwas (viel schneller als filter):
InformationsquelleAutor der Antwort Sriram