地图中的Java 8 Strem过滤器地图-Map <string,map <string,employee >>

时间:2018-12-26 05:09:33

标签: java java-8 hashmap java-stream

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

5 个答案:

答案 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”的条目。

在这种情况下,您可以将filteranyMatch一起用作第一个条件。此外,在收集阶段,您可以将过滤应用于内部地图:

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