Java8中列表中的项目对的并行处理

Bra*_*ery 1 java parallel-processing list java-8 java-stream

在中Java8,让List<Item> list我按以下顺序进行处理:

ConcurrentMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
for (int i1 = 0; i1 < list.size() - 1; i1++) {
    Item item1 = list.get(i1);
    for (int i2 = i1 + 1; i2 < list.size(); i2++) {
        Item item2 = list.get(i2);
        doSomething(item1, item2);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,我处理列表中所有有序的项目对(索引item1<的索引,<的索引item2)。现在,我想doSomething(item1, item2)为每个有序对并行运行函数。实现这一目标的最佳策略是什么?对最快的代码感兴趣。Java8流欢迎。

doSomething比如做:map.put(item1.key + " " + item2.key, item1.val + item2.val);

有序对的数量n * (n - 1) / 2,其中n是列表的大小。我还考虑平均分配工作量以达到负载平衡(目前假设每对执行时间相同)。因此,不需要doSomething(item1, item2)为每个有序对并行调用函数,而是可能为一组准备好的对并行调用函数。

Lou*_*man 5

IntStream.range(0, list.size()).parallel()
   .forEach(i1 -> 
       IntStream.range(i1 + 1, list.size()).parallel()
           .forEach(i2 -> doSomething(list.get(i1), list.get(i2))));
Run Code Online (Sandbox Code Playgroud)

这不必像其他任何答案一样复杂。

  • @BrandonMcHomery,并行流不会为每对创建单独的线程。它更聪明。 (3认同)