一尘不染

Java迭代并从地图中删除

java

我在做:

for (Object key : map.keySet())
    if (something)
        map.remove(key);

这引发了ConcurrentModificationException,所以我将其更改为:

for (Object key : new ArrayList<Object>(map.keySet()))
    if (something)
        map.remove(key);

此操作以及任何其他修改映射的过程都在同步块中。

有更好的解决方案吗?

如果没有人提出更好的解决方案,那么首先要说“没有”


阅读 364

收藏
2020-03-07

共2个答案

一尘不染

从Java 8开始,你可以执行以下操作:

map.entrySet().removeIf(e -> <boolean expression>);
2020-03-07
一尘不染

这是在for循环中使用迭代器删除条目的代码示例。

Map<String, String> map = new HashMap<String, String>() {
  {
    put("test", "test123");
    put("test2", "test456");
  }
};

for(Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); it.hasNext(); ) {
    Map.Entry<String, String> entry = it.next();
    if(entry.getKey().equals("test")) {
        it.remove();
    }
}
2020-03-07