首页 > 解决方案 > 如何使用 parallelStream 以与原始列表相同的顺序获取响应

问题描述

我有一个原始列表,我在该列表上使用并行处理(调用方法)。想要的是将该方法的响应以与原始列表相同的顺序存储到新列表中。

public List<XYZResponse> process(List<String> inputs) {
        List<XYZResponse> myResponse = new ArrayList<>();
        inputs.parallelStream().forEach(input -> {
            myResponse.add(processStringInput(input));
        });
    }
    return myResponse;
}

private XYZResponse processStringInput(String input) {
    return new XYZResponse.Builder().resp(input).build();
}

在这里,我希望我的列表与输入数组的顺序相同。从堆栈溢出尝试了其他一些答案,但没有运气。任何帮助表示赞赏。

标签: javaparallel-processingjava-stream

解决方案


它可以乱序的原因是因为forEach是无序的流终端操作。从文档

对于并行流管道,此操作不能保证尊重流的遇到顺序,因为这样做会牺牲并行性的好处。

鉴于此,您可以选择使用forEachOrdered替代方法或mapcollect保留顺序。这是mapcollect版本:

inputs.parallelStream()
    .map(input -> processStringInput(input))
    .collect(Collectors.toList());

在这个答案中有更多关于有序流与无序流和顺序流与并行流之间区别的详细信息:如何确保 java8 流中的处理顺序?.


推荐阅读