Java 如何使用parallelStream处理2个列表

Java 如何使用parallelStream处理2个列表,java,java-stream,Java,Java Stream,我有两组账号,基于CAD和美元货币。基于这些列表,我需要通过传递请求参数调用相同的方法,一个用于CAD,另一个用于USD List<List<String>> accountNumberList = Arrays.asList( accountNumbersCAD, accountNumbersUSD ); List<String> response = new ArrayList<>(); accountNumberList.para

我有两组账号,基于CAD和美元货币。基于这些列表,我需要通过传递请求参数调用相同的方法,一个用于CAD,另一个用于USD

List<List<String>> accountNumberList = Arrays.asList(
      accountNumbersCAD, accountNumbersUSD
);
List<String> response = new ArrayList<>();
accountNumberList.parallelStream().forEach(s -> {
      String response1 = null;
      String response2 = null;
    try {
        response1 = performanceService.retrievePeriodData(reqCAD).toString();
        response2 = performanceService.retrievePeriodData(reqUSD).toString();   
    } catch (ApiException e) {

    }

      response.add(response1);
      response.add(response2);
    });

return (ResponseEntity<String>) response;
请指导我如何使用parallelStream


提前谢谢

无法使用forEach从并行流填充列表,因为这将导致意外结果,并且每次生成的列表大小可能不同。而是使用同步列表或使用collect方法填充列表

List<Double> response = Collections.synchronizedList(new ArrayList<>());
在我看来,流内部的映射看起来并不复杂,而且可能没有使用并行流的意义,请自己比较顺序流和并行流的性能

作为第二个选项,您可以使用collect 2次,并且它应该比使用同步列表更有效

Function<PerformanceDataRequest, String> mapper = s -> {
    try {
        return performanceService.retrievePeriodData(s).toString();
    } catch (ApiException e) {}
 };

List<String> response = accountNumberList.parallelStream().map(mapper.apply(reqCAD)).collect(Collectors.toList());
response.addAll(accountNumberList.parallelStream().map(mapper.apply(reqUSD)).collect(Collectors.toList()));

我不知道什么是reqCAD/reqUSD,所以我改为E。

你能澄清一下你想用这两个列表做什么吗?代码片段不是很清楚。除非使用s,否则我看不出使用流(并行或其他)的意义。我以前没有注意到它,但是为什么不在流中使用s呢?如果不使用流的元素,那么使用流有什么意义?仍在学习parallelStream,因此可能以错误的方式对其进行了编码。感谢Michael的建议,但方法mapFunction会导致map出错