Java 8流重构 - 列出<obja>到Map <string,list <objb =“”>&gt;

时间:2017-11-09 21:39:03

标签: java

我正在尝试将列表转换为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。是否有可能在流媒体中也有这个?

此外,还希望为已知或存在加入时间的员工应用过滤器。

由于

1 个答案:

答案 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)