Java 8筛选器映射<String,List <Employee >>

Ran*_*nji 5 java filtering java-8 java-stream

如何Map<String, List<Employee>>使用Java 8过滤器过滤?

我仅在列表中的任何员工具有字段值时才进行过滤Gender = "M"

输入:Map<String,List<Employee>>
输出:Map<String,List<Employee>>
过滤条件:Employee.genter = "M"

另外,如果List <>在地图值上为空,我还必须在输出地图中过滤掉键(或过滤地图[我们在过滤后得到的新地图])

And*_*lko 5

要过滤掉列表中包含非性别员工的条目"M"

Map<String, List<Employee>> r2 = map.entrySet().stream()
    .filter(i -> i.getValue().stream().allMatch(e-> "M".equals(e.gender)))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Run Code Online (Sandbox Code Playgroud)

过滤掉非该性别的员工"M"

Map<String, List<Employee>> r1 = map.entrySet().stream()
    .filter(i -> !i.getValue().isEmpty())
    .collect(Collectors.toMap(Map.Entry::getKey,
        i -> i.getValue().stream()
              .filter(e -> "M".equals(e.gender)).collect(Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)

过滤掉列表中不包含任何员工的条目"M"

Map<String, List<Employee>> r3 = map.entrySet().stream()
    .filter(i -> i.getValue().stream().anyMatch(e -> "M".equals(e.gender)))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Run Code Online (Sandbox Code Playgroud)

让我们在地图中有 2 个条目:

"1" -> ["M", "M", "M"]
"2" -> ["M", "F", "M"]
Run Code Online (Sandbox Code Playgroud)

他们的结果将是:

r1 = {1=[M, M, M], 2=[M, M]}
r2 = {1=[M, M, M]}
r3 = {1=[M, M, M], 2=[M, F, M]}
Run Code Online (Sandbox Code Playgroud)


And*_*ner 1

在 Java 8 中,您可以将 a 转换Map.entrySet()为流,然后是 afilter()collect()it。示例取自此处

    Map<Integer, String> map = new HashMap<>();
    map.put(1, "linode.com");
    map.put(2, "heroku.com");

    //Map -> Stream -> Filter -> String
    String result = map.entrySet().stream()
        .filter(x -> "something".equals(x.getValue()))
        .map(x->x.getValue())
        .collect(Collectors.joining());

    //Map -> Stream -> Filter -> MAP
    Map<Integer, String> collect = map.entrySet().stream()
        .filter(x -> x.getKey() == 2)
        .collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));

    // or like this
    Map<Integer, String> collect = map.entrySet().stream()
        .filter(x -> x.getKey() == 3)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Run Code Online (Sandbox Code Playgroud)

对于您的情况,它看起来像这样,因为您还需要找出Listclass 的 a of 对象中是否存在匹配项Employee

Map<String, List<Employee>> collect = map.entrySet().stream()
            .filter(x -> x.getValue().stream()
        .anyMatch(employee -> employee.Gender.equals("M")))
            .collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
Run Code Online (Sandbox Code Playgroud)