forEach 循环期间的 java8 java.util.ConcurrentModificationException

标签 java lambda concurrency java-8 java-stream

我使用 java8 流。这是我的数据结构:

Map< String, List< String >> mmessage = getSomeMessage();

然后我遍历 map 和列表:

 mmessage.entrySet().stream().forEach( entry -> {
            entry.getValue().stream().forEach( li -> {
                if ( lis.indexOf( li ) == - 1 )  {
                    lis.add( lineItem );
                }
            });
        });

但是得到并发修改异常:

java.util.ConcurrentModificationException
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1380)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at com.web3.buyer.roomba.RoombaTurn.lambda$received$3(RoombaTurn.java:296)
    at java.util.Iterator.forEachRemaining(Iterator.java:116)
    at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at com.web3.buyer.roomba.RoombaTurn.received(RoombaTurn.java:295)
    at com.web3.buyer.SystemBus.lambda$publishToTheQueue$0(SystemBus.java:51)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

根据我的理解,遍历 map\list 不应该导致这种行为。

最佳答案

我会使用完整的函数式风格编写此代码,您不应该在迭代列表时遇到修改列表的问题。

List<String> strs = mmessage.values().stream()
                            .flatMap(List::stream)
                            .distinct()
                            .collect(Collectors.toList());

关于forEach 循环期间的 java8 java.util.ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38695140/

相关文章:

java - 简单的 Java 程序越来越消耗内存

c++ - 为什么 lambda 取变量的初始值

amazon-web-services - API 网关是否引入了显着延迟?

c++ - Qt C++ 将具有非空签名的信号连接到 lambda

java - 不可变但可刷新的集合?

java - BoxLayout 中的 createVerticalGlue() 不起作用

java - BigInteger 抛出空指针异常

python - 在 concurrent.futures 中获取异常的原始行号

java - 编译自定义 JSP 标记处理程序

java - 对象构造完成后,是否与其他线程建立了内存栅栏?