Java 8 Lambda Stream forEach mit mehreren Anweisungen
Lesezeit: 5 Minuten
RaceBase
Ich bin immer noch dabei, Lambda zu lernen, bitte entschuldigen Sie, wenn ich etwas falsch mache
final Long tempId = 12345L;
List<Entry> updatedEntries = new LinkedList<>();
for (Entry entry : entryList) {
entry.setTempId(tempId);
updatedEntries.add(entityManager.update(entry, entry.getId()));
}
//entryList.stream().forEach(entry -> entry.setTempId(tempId));
Sieht aus als ob forEach kann nur für eine Anweisung ausgeführt werden. Es gibt keinen aktualisierten Stream oder keine aktualisierte Funktion zur weiteren Verarbeitung zurück. Vielleicht habe ich die falsche gewählt.
Kann mir jemand helfen, wie ich das effektiv mache?
Habe vergessen, mich auf das erste Code-Snippet zu beziehen. würde ich nicht verwenden forEach überhaupt. Da Sie die Elemente der sammeln Stream in ein Listwäre es sinnvoller, die zu beenden Stream Verarbeitung mit collect. Dann bräuchte man peek um die ID einzustellen.
Allerdings (mit Blick auf Ihren kommentierten Versuch) können Sie in diesem Szenario keinen Filter verwenden, da Sie nur einige der Einträge verarbeiten (z. B. die Einträge für which entry.getA() == null) wenn Sie tun.
ist es nicht peek() wird nur zum Debuggen empfohlen. Ich denke, man sollte stattdessen map() ausprobieren
Im zweiten Fall würde ich vorschlagen, den Schleifenkörper in die separate Methode zu extrahieren und die Methodenreferenz zu verwenden, um ihn über aufzurufen forEach. Auch ohne Lambdas würde es Ihren Code klarer machen, da der Schleifenkörper ein unabhängiger Algorithmus ist, der den einzelnen Eintrag verarbeitet, sodass er auch an anderen Stellen nützlich sein kann und separat getestet werden kann.
Aktualisierung nach Bearbeitung der Frage. Wenn Sie Ausnahmen überprüft haben, haben Sie zwei Möglichkeiten: Entweder ändern Sie sie in ungeprüfte oder verwenden überhaupt keine Lambdas/Streams in diesem Codeabschnitt.
Was ist der Vorteil der Verwendung peek. Ich habe die Funktion nicht ausprobiert
– RaceBase
30. Juni 2015 um 5:59 Uhr
@Reddy In diesem Fall sehe ich keinen wirklichen Vorteil, da man das ausführen kann setTempId Rufen Sie entweder an peek oder hinein forEach, und das Verhalten wird ähnlich sein. Wenn Sie jedoch nicht verwenden forEach überhaupt, und verwenden Sie stattdessen collect, um die Ausgabeliste zu erstellen (siehe meine aktualisierte Antwort), die Sie benötigen würden peek um anzurufen setTempId.
Sie müssen nicht mehrere Operationen in einen Stream/Lambda packen. Erwägen Sie, sie in zwei Anweisungen aufzuteilen (unter Verwendung des statischen Imports von toList()):
So gesehen, ist das nicht so schön zu lesen … aber Sie können die 2 Verbraucher in lokale Funktionsvariablen verschieben und es würde so schön werden wie:
Ich wünsche Consumer Klasse hatte eine Methode, um mehrere Verbraucher des gleichen Typs zu kombinieren, vielleicht diese combine existiert schon irgendwo und ich weiß es nicht, also lade ich dich ein zu suchen 😅
10545100cookie-checkJava 8 Lambda Stream forEach mit mehreren Anweisungenyes
This website is using cookies to improve the user-friendliness. You agree by using the website further.