Java parallelStream映射丢失记录

时间:2018-12-19 08:47:37

标签: java java-8 java-stream

我有以下代码,有时行为不确定。例如,我在那里传递了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;
    }

1 个答案:

答案 0 :(得分:7)

因为要并行添加到一个不是线程安全的集合中,所以可能会在输出列表中看到null缺失的条目-确实不知道会发生什么。而是修改您的代码:

return events.parallelStream()
             .map(this::getEventResponse)
             .collect(Collectors.toList());

map应该没有任何副作用,而您的map操作显然可以做到,这是文档禁止的。同样不要忘记,parallel!= faster在大约99%的情况下都需要进行度量,但是我怀疑您是否需要它。