Java: set.remove() 方法不会从 Set 中删除对象

Java: set.remove() method doesn't remove the object from Set

我认为在 forEach() 循环中尝试从集合中删除对象时犯了一个小错误。 remove() 没有删除对象,任何人都可以指出问题所在吗?谢谢!

Set<RoleExtEntity> roleExtEntitySet = roleEntity.getExt(); //set size = 3
Map<String, RoleExtEntity> roleExtEntityMap = 
        new HashMap<>(roleExtEntitySet.size());

roleExtEntitySet.stream().forEach(roleExtEntity -> {
      if (role.getName() == null && roleExtEntity.getKey().equals("name")) {
            //this line doesn't work; set size should be 2 but it's still 3
            roleExtEntitySet.remove(roleExtEntity);
      } else {
            roleExtEntityMap.put(roleExtEntity.getKey(), roleExtEntity);
      }
});

can anyone point out what the issue could be

没有看到你的代码,我猜这是因为你没有正确覆盖 equals and/or hashCode,and/or 你修改了 roleExtEntity 因为它以影响 hashCode.

的方式放入地图

无论如何,如果这个 remove 实际上 确实 有效,你会冒 ConcurrentModificationException 的风险,因为你正在从你正在迭代的集合中移除。

您可以使用明确的 Iterator 来执行此操作,这样您就可以 remove():

for (Iterator<RoleExtEntity> it = roleExtEntitySet.iterator(); it.hasNext();) {
  RoleExtEntity roleExtEntity = it.next();
  if (...) {
    it.remove();
  } else {
    // ...
  }
}

另一种方法是将 forEach 拆分为进行删除的操作和进行放置的操作:

if (role.getName() == null) { // Since role appears to be unchanged in the loop
  roleExtEntitySet.removeIf(roleExtEntity -> roleExtEntity.getKey().equals("name"));
}

Map<String, RoleExtEntity> roleExtEntityMap =
    roleExtEntitySet.stream().collect(
        Collectors.toMap(RoleExtEntity::getKey, r -> r));