当前位置: 首页 > 知识库问答 >
问题:

java:Set.remove()方法不从Set中移除对象

唐俊爽
2023-03-14

在尝试从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);
      }
});

共有1个答案

吕俊才
2023-03-14

有人能指出问题是什么吗

如果没有看到您的代码,我想这是因为您没有正确地重写equals和/或hashcode,或者您修改了RoleextEntity,因为它是以影响hashcode的方式放入映射的。

尽管如此,如果此remove确实有效,您将冒ConcurrentModificationException,因为您正在从正在迭代的集合中删除。

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));
 类似资料:
  • 我知道有人问过这个问题,但我不能使用它的解决方案来做我想做的事情,我的问题是每次我从函数调用并输入一个Id,它总是告诉我Id被删除,即使我输入了一个从未输入的Id,它仍然打印相同的任何提示和帮助,将不胜感激:)注意:我不想在其中使用ArrayList这里是我的代码:

  • 下面是我的小品课: my ColorEllipse是一个椭圆2D Double,ColorRectangle是一个矩形2D Double。它们都是ColorShape的子类,继承了它的方法。

  • 如何在打字稿中从数组中删除对象? 所以我想从所有对象中删除drug_id。我该如何实现呢?谢谢!

  • 大家早上好。我有以下代码: 问题是,uri变量被分配给RestTemplate构造函数为,也就是说,它从代码变量中删除初始的。

  • 这是我一开始的消息来源。 我的名单 如何在不移除0值的情况下从列表中移除None值?

  • 问题内容: 这是更新mysql SET字段,从字段中删除特定值的最佳方法。 例如。值分别为1,2,3,4,5的字段类别?我想从列表中删除“ 2”: 但是,如果“ 2”是列表中的第一个或最后一个值,该怎么办? 我如何用一个查询处理所有3种情况? 问题答案: 如果您需要从集合中删除的值不能多次出现,则可以使用以下方法: 看到它在这里工作。如果该值可以多次出现,则将删除所有出现的值: