Map中的Java 8流过滤器Map-- Map〈String,Map〈String,Employee>>

4zcjmb1e  于 2022-12-10  发布在  Java
关注(0)|答案(5)|浏览(187)

如何使用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));
s5a0g9ez

s5a0g9ez1#

您可以简单地对键值对进行迭代并筛选为:

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)));
    }
});
wh6knrhe

wh6knrhe2#

函数allMatch仅在流中的每个元素都与 predicate 匹配时才匹配;如果有任何元素与 predicate 匹配,则可以使用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));
hec6srdp

hec6srdp3#

看起来你所追求的是一个Entry<String,Map<String,Employee>>,如果有任何员工的性别为“M”,然后过滤内部的Map<String,Employee>,只包含性别为“M”的条目。
在这种情况下,您可以将filteranyMatch沿着作为第一个标准。此外,在收集阶段,您可以在内部Map上应用过滤:

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))));
bq8i3lrv

bq8i3lrv4#

你可以这样做,

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));

从外部Map中取出每个Map条目,并使用相同的键和新构建的嵌套Map创建一个新的Map条目,该嵌套Map具有相同的键,并且只有男性雇员作为其值。最后,将所有这些匹配条目收集到一个新的外部Map中。这将很好地处理您在上面的问题陈述中提到的空场景。

lkaoscv7

lkaoscv75#

其他的办法会是这样的:

map.values()
     .removeIf(entry->entry.values().stream().anyMatch(e -> !"M".equals(e.getGender())));

map.entrySet()
    .removeIf(entry->entry.getValue().size() == 0);

相关问题