繁体   English   中英

如何使用parallelStream以与原始列表相同的顺序获取响应

[英]How to get responses in the same order as the original list using 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();
}

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

它会乱序的原因是因为forEach是一个无序的流终端操作。 文档

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

鉴于此,您可以选择使用类似forEachOrdered替代品或mapcollect类的东西来保留订单。 这是mapcollect版本:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM