我正在尝试将列表转换为Map。
列表就像
List<Employee> employeesList = new ArrayList<>();
我希望将其转换为Map,
Map<String, List<RetiredEmployee>> empsMap = new HashMap<>();
此处,密钥为员工姓名,对象为RetiredEmployee,其中包含employee。
class RetiredEmployee {
private final Employee employee;
private final Optional<LocalDateTime> empJoinTime;
RetiredEmployee(final Employee employee) {
this.employee = employee;
this.empJoinTime = getEmpJoinTime(employee);
}
}
以下代码适用于
List<Employee> to Map<String, List<Employee>>
employeesList.stream().collect(Collectors.groupingBy(Employee::getName));
但不确定,如何将此员工转换为此分组中的新RetiredEmployee(员工)或进一步流式传输。
另外,我需要列表中的最后一个员工ID。是否有可能在流媒体中也有这个?
此外,还希望为已知或存在加入时间的员工应用过滤器。
由于
答案 0 :(得分:2)
我可以想到两个选择。一种方法是使用Collectors.mapping()
转换值:
employeesList.stream()
.collect(Collectors.groupingBy(Employee::getName,
Collectors.mapping(RetiredEmployee::new, Collectors.toList())))
使用Java 9,您可以使用filtering()
收集器来排除没有加入时间的员工。
或者您可以将流映射到RetiredEmployee
,然后间接提取名称。这样可以更轻松地在连接时添加过滤器:
employeesList.stream()
.map(RetiredEmployee::new)
.filter(e -> e.getEmpJoinTime().isPresent())
.collect(Collectors.groupingBy(e -> e.getEmployee().getName()))
至于从列表中获取最后一名员工,我不会看到困难,或者它与流完全相关。只需使用employeesList.get(employeesList.size() - 1)
。