Java 在映射中添加项目时的ConcurentModificationException

Java 在映射中添加项目时的ConcurentModificationException,java,java-8,Java,Java 8,在将项添加到与键对应的现有列表时,我面临java.util.ConcurrentModificationException 这是我的密码 final Map<String, List<Apple>> feedToApplesMap = new HashMap<>(); for (final Apple Apple : AppleList) { final List<String> feedDocumentIds = Apple.getFee

在将项添加到与键对应的现有列表时,我面临java.util.ConcurrentModificationException

这是我的密码

final Map<String, List<Apple>> feedToApplesMap = new HashMap<>();
for (final Apple Apple : AppleList) {
    final List<String> feedDocumentIds = Apple.getFeedDocumentIds();
    for (final String feedId : feedDocumentIds) {
        final List<Apple> AppleListForFeed = feedToApplesMap
                .getOrDefault(feedId, new ArrayList<>());
        AppleList.add(Apple);
        feedToApplesMap.put(feedId, AppleListForFeed);
    }
}
final Map feedToApplesMap=new HashMap();
用于(最终苹果:苹果列表){
最终列表FeedDocumentId=Apple.getFeedDocumentId();
用于(最终字符串feedId:feedDocumentID){
最终列表AppleListForFeed=feedToApplesMap
.getOrDefault(feedId,new ArrayList());
AppleList.add(苹果);
feedToApplesMap.put(feedId,AppleListForFeed);
}
}

我无法使用迭代器来解决这个问题?有什么建议吗?

看来你把苹果放错地方了。难道不是吗


AppleListForFeed.add(Apple)
而不是
AppleList.add(Apple)

看起来你把苹果放错地方了。难道不是吗


AppleListForFeed.add(Apple)
而不是
AppleList.add(Apple)

我同意@andbi的观点,这个问题是由于打字错误造成的。但是作为一个例外,这样做
for(final Apple:AppleList)
您仍然在无意中使用迭代器,这就是为什么这里
AppleList.add(Apple)
将抛出ConcurrentModificationException,您可以这样做以避免使用迭代器:

final Map<String, List<Apple>> feedToApplesMap = new HashMap<>();
int size = AppleList.size();
for (int i = 0; i < size; i++) {
    final Apple Apple = AppList.get(i);
    final List<String> feedDocumentIds = Apple.getFeedDocumentIds();
    for (final String feedId : feedDocumentIds) {
        final List<Apple> AppleListForFeed = feedToApplesMap
                .getOrDefault(feedId, new ArrayList<>());
        AppleList.add(Apple);
        feedToApplesMap.put(feedId, AppleListForFeed);
    }
}

final Map我同意@andbi的观点,这个问题是由于打字错误造成的。但是作为一个例外,这样做
for(final Apple:AppleList)
您仍然在无意中使用迭代器,这就是为什么这里
AppleList.add(Apple)
将抛出ConcurrentModificationException,您可以这样做以避免使用迭代器:

final Map<String, List<Apple>> feedToApplesMap = new HashMap<>();
int size = AppleList.size();
for (int i = 0; i < size; i++) {
    final Apple Apple = AppList.get(i);
    final List<String> feedDocumentIds = Apple.getFeedDocumentIds();
    for (final String feedId : feedDocumentIds) {
        final List<Apple> AppleListForFeed = feedToApplesMap
                .getOrDefault(feedId, new ArrayList<>());
        AppleList.add(Apple);
        feedToApplesMap.put(feedId, AppleListForFeed);
    }
}

final Map当我们使用for循环或for each迭代列表时,会发生这种情况,在迭代过程中会在列表之间添加一些元素,因此请使用迭代器或迭代列表:

val iterator = yourList.iterator()
    while (iterator.hasNext()) {
        val currentItem = iterator.next()
    }

现在,在迭代过程中添加或删除列表中的任何其他元素。

当我们使用for循环或for each迭代列表时,会发生这种情况,并且在迭代过程中会在列表之间添加一些元素,因此请使用迭代器或迭代列表:

val iterator = yourList.iterator()
    while (iterator.hasNext()) {
        val currentItem = iterator.next()
    }

现在,在迭代过程中添加或删除列表中的任何其他元素。

为什么要执行
AppleList.add(Apple)?请编辑您的问题以包含异常的完整堆栈跟踪。更适合Java 8的方法是使用
groupingBy()
。通过这样做,您可能会摆脱所有嵌套循环,并限制出现错误的可能性(例如
add()
到代码中的错误列表中)。遵守命名约定。这段代码真的很难阅读。显然,您想要添加到
AppleListForFeed
,而不是
AppleList
。在这种情况下,将整个循环体简化为
feedToApplesMap.computeIfAbsent(feedId,key->newarraylist()).add(Apple)
,因此您不需要另一个
put
操作。为什么要执行
AppleList.add(Apple)?请编辑您的问题以包含异常的完整堆栈跟踪。更适合Java 8的方法是使用
groupingBy()
。通过这样做,您可能会摆脱所有嵌套循环,并限制出现错误的可能性(例如
add()
到代码中的错误列表中)。遵守命名约定。这段代码真的很难阅读。显然,您想要添加到
AppleListForFeed
,而不是
AppleList
。在这种情况下,将整个循环体简化为
feedToApplesMap.computeIfAbsent(feedId,key->newarraylist()).add(Apple)
,因此不需要另一个
put
操作。