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));
我认为在 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));