【发布时间】:2015-08-06 22:39:44
【问题描述】:
在Java8中,处理两个并行流中的项目对,如下所示:
final List<Item> items = getItemList();
final int l = items.size();
List<String> results = Collections.synchronizedList(new ArrayList<String>());
IntStream.range(0, l - 1).parallel().forEach(
i -> {
Item item1 = items.get(i);
int x1 = item1.x;
IntStream.range(i + 1, l).parallel()
.forEach(j -> {
Item item2 = items.get(j);
int x2 = item2.x;
if (x1 + x2 < 200) return;
// code that writes to ConcurrentHashMap defined near results
if (x1 + x2 > 500) results.add(i + " " + j);
});
}
);
每个流对都写入ConcurrentHashMap,并且根据某些条件,它可能会通过调用return; 来终止流执行,或者它可能会写入同步列表。
我想让流返回像return i + " " + j 这样的结果,并将这些结果收集到外面的列表字符串中。它应该是部分的,因为必须支持不返回任何内容(以防x1 + x2 < 200)。
实现这一目标的最省时(最快的代码)方法是什么?
【问题讨论】:
-
请提供正确的编译代码。您的
results被声明为数组,但您像列表一样使用它。ConcurrentHashMap在哪里?你到底在写什么?另请提供示例输入和所需的输出。现在有点不清楚你想要实现什么。 -
如果
x1 + x2 > 500,您只会添加到results。为什么不使用收集器?另外......据我所知,你不能从这样的 foreach 中返回。 -
在您的特定示例中,并行执行可能不会产生更快的性能。查看此问题及其最佳答案:stackoverflow.com/questions/23170832/…
-
在关心时间效率之前,我认为你应该关心正确性。 (1) 如果您需要在特定条件下终止流,则不能并行化,否则您无法控制执行顺序,并且可能有对添加到
results列表中,这些对在逻辑上出现在触发您的停止条件的对之后 @ 987654333@。 (2) 像这样的return;绝对不是停止流执行的方法。
标签: parallel-processing java-8 java-stream