【问题标题】:java8 java.util.ConcurrentModificationException during forEach cycleforEach 循环期间的 java8 java.util.ConcurrentModificationException
【发布时间】:2016-08-01 09:19:15
【问题描述】:

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

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

然后我遍历地图和列表:

 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 进行迭代不应导致这种行为。

【问题讨论】:

  • 什么是lis,它与mmessageMap有什么关系?
  • 您不能将 valies 添加到您正在迭代的列表中
  • @Jens OP 没有向同一个列表添加值(至少我们还不知道,因为我们不知道 lis 是什么)。
  • 是的,我明白了,它只是另一个结构,比如 lis = new ArrayList();但你是对的,它因不同的原因而失败。谢谢!
  • lis 是地图中的一个值;这就是它失败的原因。

标签: java lambda concurrency java-8 java-stream


【解决方案1】:

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

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

【讨论】:

  • 我喜欢这个解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
相关资源
最近更新 更多