Ich baue ein Objekt mit einer einfachen Schleife:
%Vor%Ich möchte dasselbe mit der Java8-Stream-API tun, aber ich kann nicht herausfinden, wie es geht. Was mich dazu bringt zu kämpfen ist, dass das Ziel jedes Mal neu zugewiesen wird, so dass ein einfaches .forEach () nicht funktioniert. Ich denke, ich muss ein .collect () oder reduce () verwenden, da ich nach einem einzelnen Rückgabewert suche, aber ich bin im Moment verloren!
Leider gibt es in der Stream-API keine Methode foldLeft
. Der Grund dafür wird von Stuart Marks in diese Antwort :
[...] Schließlich stellt Java keine
foldLeft
- undfoldRight
-Operationen zur Verfügung, da sie eine bestimmte Reihenfolge von Operationen beinhalten, die inhärent sequenziell sind. Dies kollidiert mit dem oben genannten Konstruktionsprinzip, APIs bereitzustellen, die den sequenziellen und parallelen Betrieb gleichermaßen unterstützen.
Was Sie hier letztendlich versuchen, ist etwas prozedurales / sequentielles, daher glaube ich nicht, dass die Stream-API für diesen Anwendungsfall gut geeignet ist. Ich denke, die for-each-Schleife, die du selbst gepostet hast, ist so gut wie es geht.
Aktualisierung:
Da @TagirValeev unten darauf hinweist, dass Sie es tatsächlich mit der Stream-API lösen können (mit forEachOrdered
Ihr Code würde dann ungefähr wie
Ich stehe jedoch zu meiner ursprünglichen Antwort und behaupte, dass Ihre gute alte For-Schleife in diesem Fall ein besserer Ansatz ist.
Es ist nicht sehr schwierig, eine korrekte foldLeft
für Java 8 Streams zu implementieren:
Oder in typensicherer Weise:
%Vor% Dies funktioniert korrekt für sequentielle und parallele Streams. Sie können sogar eine Geschwindigkeitsverstärkung durch parallele Streams erzielen, wenn Ihr Stream CPU-aufwändige statusfreie Zwischenoperationen wie map
hat: In diesem Fall kann das nächste Element von map
parallel mit dem von% co_de verarbeiteten Element verarbeitet werden %. Ich stimme nicht zu, dass eine solche Operation für die Stream-API nicht geeignet ist, da sie über das bereits vorhandene foldLeft
korrekt ausgedrückt werden kann.
Ich habe diese Operation in meiner StreamEx -Bibliothek, so dass Sie sie wie folgt verwenden können:
%Vor%Tags und Links java java-8 builder java-stream