java - 当我为 Set 执行 addAll 时出现 ConcurrentModificationException
问题描述
allStates.addAll(states)
我在下面的代码中得到了一个 concurrentModificationException 。我怎样才能避免这种情况?
public synchronized Set<String> getAllStates(String clientName, Map<String, Set<String>> allClientStates) {
Set<String> allStates = new ConcurrentSkipListSet<>();
final Set<String> keySet = allClientStates.keySet();
for(String key: keySet) {
Set<String> states = allClientStates.get(key);
if(states != null)
allStates.addAll(states);
}
return allStates;
}
这是堆栈跟踪的顶部
exception": "null\njava.util.ConcurrentModificationException\n\tat java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)\n\tat java.util.HashMap$KeyIterator.next(HashMap.java:1469)\n\tat java.util.AbstractCollection.addAll(AbstractCollection.java:343)\n\tat com.xxx.config.ClientDashboardConfig.getAllStates(ClientDashboardConfig.java:312)
解决方案
allClientStates.values().stream()
.flatMap(keys -> keys.stream())
.collect(Collectors.toSet());
推荐阅读
- c# - 在 pagedgridview 中对模板字段进行排序
- regex - Java 或 Python 正则表达式搜索大型单词列表
- python - Amazon Affiliate Link Builder python 脚本崩溃?
- mysql - 将 MySQL 中的行与同一时间戳上的空值合并
- bash - 在 bash 中分离“源”参数和“父脚本”参数
- netlogo - 如何使用 NetLogo 行为空间收集定向链接的“ID”?
- android - Android:我们如何让 BiometricPrompt 与三星 s10(超声波指纹扫描仪)一起使用
- reactjs - 将 React 状态设置为值后,在 componentDidUpdate 中将其覆盖为空
- jquery - 如何将数组值添加到现有的 jQuery cookie?
- vba - 使用自定义函数计算两条记录之间的数学运算