在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);
}
}
所以我处理列表中所有有序的项目对(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)
对每个有序对并行运行,但可能对一组准备好的对并行运行。
最佳答案
IntStream.range(0, list.size()).parallel()
.forEach(i1 ->
IntStream.range(i1 + 1, list.size()).parallel()
.forEach(i2 -> doSomething(list.get(i1), list.get(i2))));
这不必像其他任何答案一样复杂。
关于java - 并行处理 Java8 列表中的项目对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31796799/