如何使用Java 8过滤器过滤Map<String,Map<String,Employee>>
?
仅当列表中任何一个员工的字段值为Gender =“ M”时,我才需要过滤。
输入:
Map<String,Map<String,Employee>>
输出:
Map<String,Map<String,Employee>>
过滤条件:
Employee.genter = "M"
如果过滤结果为空,我还必须返回空地图。
我尝试了以下操作,但无法正常工作。只有所有员工的性别均为“ M”时,它才返回。
tempCollection.entrySet().stream()
.filter(i -> i.getValue().entrySet().stream().allMatch(e-> "M".equals(e.getValue().getGender())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
答案 0 :(得分:1)
您可以简单地对键值对进行迭代,并过滤为:
Map<String, Map<String, Employee>> output = new HashMap<>();
tempCollection.forEach((k, v) -> {
if (v.values().stream().anyMatch(i -> "M".equals(i.getGender()))) {
output.put(k, v.entrySet()
.stream()
.filter(i -> "M".equals(i.getValue().getGender()))
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue)));
}
});
答案 1 :(得分:1)
如果有任何员工的性别为“ M”,则似乎给您一个Entry<String,Map<String,Employee>>
,然后过滤内部的Map<String,Employee>
以仅包含性别为“ M”的条目。
在这种情况下,您可以将filter
和anyMatch
一起用作第一个条件。此外,在收集阶段,您可以将过滤应用于内部地图:
tempCollection.entrySet().stream()
.filter(i -> i.getValue().values().stream().anyMatch(e -> "M".equals(e.getGender())))
.collect(toMap(Map.Entry::getKey,
v -> v.getValue().entrySet().stream()
.filter(i -> "M".equals(i.getValue().getGender()))
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue))));
答案 2 :(得分:1)
函数allMatch
仅在流中的每个元素都与谓词匹配时才匹配;您可以使用anyMatch
来匹配是否有任何元素与谓词匹配:
tempCollection.entrySet().stream()
.filter(i -> i.getValue().entrySet().stream().anyMatch(e-> "M".equals(e.getValue().getGender())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
答案 3 :(得分:1)
您可以这样做
Map<String, Map<String, Employee>> maleEmpMap = tempCollection.entrySet().stream()
.map(e -> new AbstractMap.SimpleEntry<>(e.getKey(),
e.getValue().entrySet().stream().filter(emp -> "M".equals(emp.getValue().getGender()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
从外部地图中获取每个地图条目,并使用相同的键和具有相同键的新构建的嵌套地图(其值仅包含男性雇员)来创建新的地图条目。最后,将所有匹配的条目收集到新的外部地图中。这样可以妥善处理您在上面的问题说明中提到的空方案。
答案 4 :(得分:0)
其他方式如下:
map.values()
.removeIf(entry->entry.values().stream().anyMatch(e -> !"M".equals(e.getGender())));
map.entrySet()
.removeIf(entry->entry.getValue().size() == 0);