4 回答
TA贡献1815条经验 获得超6个赞
这应该可以解决问题:
myMap.entrySet() .removeIf(e -> e.getValue() .stream() .anyMatch(User::is50));
请注意,entrySet() 修改 (removeIf) 会影响条目集支持的映射。因此,您要么必须制作地图的副本并在副本上运行它,要么让第一个地图 ( myMap
) 被修改。
至于制作地图副本,您可以简单地执行以下操作:
Map<String, List<User>> copy = new HashMap<>(myMap);
就地删除的更好方法如下:
myMap.values() .removeIf(v -> v.stream() .anyMatch(User::is50));
这更好的原因有四个:
getValue
您可以取消对since 的调用,因为values
它直接提供了值集。values
它更清楚地传达意图 -与价值之间的逻辑跳跃比entrySet
与价值之间的逻辑跳跃更少。它更简洁并且不是反模式(例如,使用
peek
outside of debugging 是一种反模式,尽管有时更简洁)。它仍然有效,因为返回的 Collection由 map
values
支持。
TA贡献1770条经验 获得超3个赞
只需用于Stream::noneMatch
您的嵌套 Stream :
Map<String, List<User>> filteredMap = myMap.entrySet() .stream() .filter(e -> e.getValue() .stream() .noneMatch(User::is50) ) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); filteredMap.forEach((key, value) -> System.out.println(key));
输出是:
B C
在此解决方案myMap
中将不受影响,因为我stream
用完了entrySet
然后收集了它。Set::removeIf
会改变你以前的地图,因为支持你原来的条目的Map::entrySet
返回。Set
Map
TA贡献1898条经验 获得超8个赞
如您所见,您必须对 EntrySet 进行操作。您可以将其转换为流并收集回新地图,如下所示:
myMap.entrySet().stream() .filter(e -> e.getValue().stream().noneMatch(User::is50)) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))
TA贡献1828条经验 获得超4个赞
您可以使用 Map EntrySet 来解析您的地图,然后解析每个条目中的列表
for (Map.Entry<String, List<User> entry : myMap.entrySet())
{
boolean toDelete = false;
for (User user : entry.getValue())
{
if (user.age == 50)
toDelete = true;
}
if (toDelete)
myMap.remove(entry.getKey());
}
添加回答
举报