我有以下代码,有时行为不确定。例如,我在那里传递了3个事件,输出只有两个!您能解释这种行为的原因吗?
public List<AbstractTransactionResponse> getEventResponse(final List<AbstractEvent> events){
List<AbstractTransactionResponse> abstractTransactionResponses = new ArrayList<>();
events.parallelStream().map(event -> {
abstractTransactionResponses.add(getEventResponse(event));
return null;
}).collect(Collectors.toList());
return abstractTransactionResponses;
}
答案 0 :(得分:7)
因为要并行添加到一个不是线程安全的集合中,所以可能会在输出列表中看到null
缺失的条目-确实不知道会发生什么。而是修改您的代码:
return events.parallelStream()
.map(this::getEventResponse)
.collect(Collectors.toList());
map
应该没有任何副作用,而您的map
操作显然可以做到,这是文档禁止的。同样不要忘记,parallel
!= faster
在大约99%的情况下都需要进行度量,但是我怀疑您是否需要它。