首页 > 解决方案 > 过滤地图列表的元素,然后在java 8+中返回地图

问题描述

我想过滤地图列表的元素,然后在java 8+中返回地图

public class Test {
    List<Employee> list1 = new ArrayList<>();
    list1.add(emp1);                   // emp1's  filterEmployee return true    
    list1.add(emp2);                   // emp2's  filterEmployee return true  
    list1.add(emp3);                   // emp3's  filterEmployee return false  

    List<Employee> list2 = new ArrayList<>();
    list2.add(emp4);                    // emp4's  filterEmployee return false        
    list2.add(emp5);                    // emp5's  filterEmployee return true 
    list2.add(emp6);                    // emp6's  filterEmployee return true 

    map.put("Sales", list1);
    map.put("Tech", list2);



    public Map<Department, List<Employee>> getEmployeeByDepartment( Map<Department, List<Employee>> map)
    {
        return map1;
    }   

    static boolean filterEmployee(Employee employee)
    {
        check employee something and filter out based on some critiea
        and return true or false based on that
    }
}

在 getEmployeeByDepartment 方法中,对于地图中的每个条目,使用下面的 filterEmployee 方法过滤地图值列表中的员工,返回的 map1 将包含地图,使得

<"Sales", list1.add(emp1)> // emp1 的 filterEmployee 返回 true

<"Sales", list1.add(emp2)> // emp2 的 filterEmployee 返回 true

<"Tech", list2.add(emp5)> // emp5 的 filterEmployee 返回 true

<"Tech", list2.add(emp6)> // emp6 的 filterEmployee 返回 true

我一直在尝试这个和下面的那个,但没有奏效

Map<Department, List<Employee>> map2 = map.entrySet().stream().filter(entry -> entry.getValue().stream().filter(Test::filterEmployee).collect(Collectors.toMap((Department)entry.getKey(), (List<Employee>)entry.getValue())));

标签: java

解决方案


假设

Predicate<Employee> test;
Map<Department,List<Employee>> map;

你有几个选择:

对地图的就地更改:

map.values().forEach(el -> el.removeIf(Predicate.not(test)));

插入新地图:

Map<Department,List<Employee>> result = new HashMap<>();
map.forEach((d, el) -> result.put(d, el.stream().filter(test).collect(toList()));

通过流处理创建:

Map<Department,List<Employee>> result = map.keySet().stream()
    .collect(toMap(d -> d, d -> map.get(d).stream().filter(test).collect(toList())));

还有其他选择,但这些是最明显的选择。


推荐阅读