java - 如何使用 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
替代方法或map
并collect
保留顺序。这是map
和collect
版本:
inputs.parallelStream()
.map(input -> processStringInput(input))
.collect(Collectors.toList());
在这个答案中有更多关于有序流与无序流和顺序流与并行流之间区别的详细信息:如何确保 java8 流中的处理顺序?.
推荐阅读
- reactjs - ReactJS 警告:更改组件后遇到两个具有相同键的子项
- image - 在 Flutter 中,如何在主屏幕中接收图像,然后将其重定向到另一个屏幕?
- reactjs - 刷新网页后,React webpack hotload 卡在 index.html 上
- excel - Excel COUNTIFS OR 函数用于非排他匹配
- python - 在 Python 中使用递归的素数总和
- ffmpeg - 使用 FFMPEG 创建 HLS FLAC 流
- avl-tree - 计算最大重叠间隔数
- javascript - javascript || (或)条件有更好的表现或包括?
- reactjs - 离开组件时如何执行功能?
- vba - 如何使用 VBA Selenium webdriver 将日期值发送到只读输入框