迭代地图并从中移除

2022-08-31 05:11:25

我正在做:

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

它抛出了一个 ConcurrentModificationException,所以我把它改成了:

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

this 以及修改映射的任何其他过程都位于同步块中。

有没有更好的解决方案?


答案 1

下面是一个代码示例,用于在 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();
    }
}

答案 2

从Java 8开始,您可以按如下方式执行此操作:

map.entrySet().removeIf(e -> <boolean expression>);

Oracle Docs: entrySet()

集合由映射支持,因此对映射的更改将反映在集合中,反之亦然


推荐