如何用Java 8 Stream获取指定部门的员工子Map?
解决方法
你的代码主要有两个问题:一是Collectors.toMap()缺少必要的参数,二是泛型类型不匹配,以下是修正后的实现:
情况1:保留原员工对象类型
如果不需要转换员工的类型,目标Map的value应该和原Map一致(List<Employee>),正确代码如下:
Map<String, List<Employee>> map_empl_law_dept = map_empl_by_dept.entrySet() .stream() .filter(entry -> set_dept_law.contains(entry.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
情况2:提取员工属性转为String(比如姓名)
如果确实需要把员工列表转为List<String>(比如提取员工姓名),可以在收集时嵌套Stream转换:
// 假设Employee类有getName()方法返回员工姓名 Map<String, List<String>> map_empl_law_dept = map_empl_by_dept.entrySet() .stream() .filter(entry -> set_dept_law.contains(entry.getKey())) .collect(Collectors.toMap( Map.Entry::getKey, entry -> entry.getValue().stream() .map(Employee::getName) .collect(Collectors.toList()) ));
原代码错误说明
Collectors.toMap()必须指定两个参数:用于提取键的函数和用于提取值的函数,你之前没有传参,导致编译失败;- 泛型不匹配:原Map的value是
List<Employee>,如果没有转换逻辑,目标Map的value类型不能直接写成List<String>。
内容的提问来源于stack exchange,提问作者code_warrior
相关产品推荐
相关产品推荐

