[英]Is there a way to zip two streams?
這個問題源於另一個問題的答案,其中建議map和reduce同時計算一個和。
在那個問題中有一個復雜的計算complexCalculation(e)
,但現在我想知道如何通過將計算分成兩部分來進行更多的並行化,以便complexCalculation(e)
= part1(e)
* part2(e)
。 我想知道是否有可能同時計算集合上的part1和part2 map()
再次使用map()
)然后壓縮兩個結果流,以便兩個流的第i個元素與函數*組合,以便生成的流等於可以通過在該集合上映射complexCalculation(e)
獲得的流。 在代碼中,這看起來像:
Stream map1 = bigCollection.parallelStream().map(e -> part1(e));
Stream map2 = bigCollection.parallelStream().map(e -> part2(e));
// preferably map1 and map2 are computed concurrently...
Stream result = map1.zip(map2, (e1, e2) -> e1 * e2);
result.equals(bigCollection.map(e -> complexCalculation(e))); //should be true
所以我的問題是:是否存在一些功能,比如我試圖在這里描述的zip
功能?
parallelStream()保證在提交的順序中完成。 這意味着您不能假設兩個parallelStream可以像這樣壓縮在一起。
您的原始bigCollection.map(e -> complexCalculation(e))
可能會更快,除非您的集合實際上小於您擁有的CPU數量。
如果你真的想並行化part1
和part2
(例如你的bigCollection只有很少的元素,少於CPU內核),你可以做以下技巧。 假設您在當前類中有兩個方法part1
和part2
:
public long part1(Type t) { ... }
public long part2(Type t) { ... }
創建一個由這些方法創建的兩個函數的流,並將其並行處理,如下所示:
bigCollection.parallelStream()
.map(e -> Stream.<ToLongFunction<Type>>of(this::part1, this::part2)
.parallel()
.mapToLong(fn -> fn.applyAsLong(e)).reduce(1, (a, b) -> a*b))
.// continue the outer stream operations
然而,這是非常罕見的情況。 作為@PeterLawrey指出,如果你的外集夠大,沒必要並行part1
和part2
。 相反,您將並行處理單獨的元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.