我有2组基于CAD和USD货币的帐号。基于这些列表,我需要通过传递请求参数(一个用于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
。
谢谢!
答案 0 :(得分:1)
您不能使用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
。