簡體   English   中英

有沒有辦法壓縮兩個流?

[英]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數量。

如果你真的想並行化part1part2 (例如你的bigCollection只有很少的元素,少於CPU內核),你可以做以下技巧。 假設您在當前類中有兩個方法part1part2

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指出,如果你的外集夠大,沒必要並行part1part2 相反,您將並行處理單獨的元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM