首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >set.remove()方法不会从Set中删除对象

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

Stack Overflow用户
提问于 2021-09-29 09:31:41
回答 1查看 72关注 0票数 0

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

代码语言:javascript
运行
复制
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);
      }
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-29 09:38:17

任何人都能指出问题的所在

在没有看到代码的情况下,我猜想这是因为您没有正确地覆盖equals和/或hashCode,而且/或您已经修改了roleExtEntity,因为它被放入到映射中,从而影响了hashCode

不管怎么说,如果这个remove确实工作了,您就会冒出一个ConcurrentModificationException的风险,因为您正在从正在迭代的集合中移除。

相反,您可以使用显式Iterator来实现这一点,它允许您使用remove()

代码语言:javascript
运行
复制
for (Iterator<RoleExtEntity> it = roleExtEntitySet.iterator(); it.hasNext();) {
  RoleExtEntity roleExtEntity = it.next();
  if (...) {
    it.remove();
  } else {
    // ...
  }
}

另一种选择可以是将forEach分解为执行移除操作和执行放置操作的操作:

代码语言:javascript
运行
复制
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));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69373781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档