Builder-Muster mit einem Java 8 Stream

8

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!

    
Francesco 09.06.2015, 15:33
quelle

2 Antworten

6

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 - und foldRight -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

aussehen %Vor%

Ich stehe jedoch zu meiner ursprünglichen Antwort und behaupte, dass Ihre gute alte For-Schleife in diesem Fall ein besserer Ansatz ist.

    
aioobe 23.05.2017, 11:54
quelle
8

Es ist nicht sehr schwierig, eine korrekte foldLeft für Java 8 Streams zu implementieren:

%Vor%

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%     
Tagir Valeev 09.06.2015 18:06
quelle

Tags und Links