如何使用Java 8过滤器过滤Map<String,Map<String,Employee>>
?
只有当列表中的任何雇员具有字段值Gender =“M”时,我才必须进行筛选。
输入:Map<String,Map<String,Employee>>
输出量:Map<String,Map<String,Employee>>
筛选条件:Employee.genter = "M"
此外,我必须返回空Map,如果过滤的结果是空的。
我尝试了下面的,但它不像预期的那样工作。它是返回唯一的,如果所有的员工都是性别“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));
5条答案
按热度按时间s5a0g9ez1#
您可以简单地对键值对进行迭代并筛选为:
wh6knrhe2#
函数
allMatch
仅在流中的每个元素都与 predicate 匹配时才匹配;如果有任何元素与 predicate 匹配,则可以使用anyMatch
进行匹配:hec6srdp3#
看起来你所追求的是一个
Entry<String,Map<String,Employee>>
,如果有任何员工的性别为“M”,然后过滤内部的Map<String,Employee>
,只包含性别为“M”的条目。在这种情况下,您可以将
filter
与anyMatch
沿着作为第一个标准。此外,在收集阶段,您可以在内部Map上应用过滤:bq8i3lrv4#
你可以这样做,
从外部Map中取出每个Map条目,并使用相同的键和新构建的嵌套Map创建一个新的Map条目,该嵌套Map具有相同的键,并且只有男性雇员作为其值。最后,将所有这些匹配条目收集到一个新的外部Map中。这将很好地处理您在上面的问题陈述中提到的空场景。
lkaoscv75#
其他的办法会是这样的: