2017-02-17 21 views
1

我有一個集合,我希望使用流API將其減少爲單個值。它看起來像collectreduce將運行良好,除了他們都想要combiner對象合併平行結果。就我而言,我沒有合併操作。當沒有組合函數存在時收集/減少流

流中不會有很多元素,所以我很樂意讓它連續運行。有沒有辦法解決這個問題?

如果我流包含1,2和3,我希望做的

result = new Foo().foo(1).foo(2).foo(3); 

相當於看來

result = stream.reduce(new Foo(), 
         (foo, ele) -> foo.foo(ele), 
         null); 

可能會工作,但在某些時候,某些變化(稍長一點的列表,新的Java版本)combiner將被調用,這將打破。

我正在返回一個不同的類型,因此reduce(BiFunction)將不適用於我。

+0

通過一個字段列表檢索地圖的內部的[java8流風格,可能的重複? ](http://stackoverflow.com/questions/42278737/java8-stream-style-for-retrieving-a-inner-part-of-map-through-a-field-list) – shmosel

+0

如果你關心的是在使用組合器的流API的奇思妙想中,爲什麼不使用純循環呢? –

+0

@shmosel這看起來會解決問題。雖然它看起來有點複雜,就像它試圖解決語言引入的問題一樣。 –

回答

1

我只想用一個循環遍歷集合中的元素:

Foo result = new Foo(); 
for (int ele : collection) { 
    result = result.foo(ele); 
} 

這是很容易閱讀,類似冗長的數據流的辦法,你不擔心自己的行爲改變出乎意料的是因爲Streams圖書館的黑巫術。

1

如果您更願意堅持到流,你可以,因爲它是允許有狀態使用forEachOrdered

AtomicReference<Foo> foo = new AtomicReference<>(new Foo()); 
stream.forEachOrdered(ele -> foo.updateAndGet(f -> f.foo(ele)));   
Foo result = foo.get();