Java 8流式重构-列表<;ObjA>;映射<;字符串,列表<;ObjB>&燃气轮机;

Java 8流式重构-列表<;ObjA>;映射<;字符串,列表<;ObjB>&燃气轮机;,java,Java,我正在尝试将列表转换为地图 列表如下所示 List<Employee> employeesList = new ArrayList<>(); List employeesList=new ArrayList(); 我想把它转换成地图一样 Map<String, List<RetiredEmployee>> empsMap = new HashMap<>(); Map empsMap=newhashmap(); 这里,键是empl

我正在尝试将列表转换为地图

列表如下所示

List<Employee> employeesList = new ArrayList<>();
List employeesList=new ArrayList();
我想把它转换成地图一样

Map<String, List<RetiredEmployee>> empsMap = new HashMap<>();
Map empsMap=newhashmap();
这里,键是employee name,对象是包含employee的RetiredEmployee

class RetiredEmployee {

   private final Employee employee;
   private final Optional<LocalDateTime> empJoinTime;

        RetiredEmployee(final Employee employee) {
            this.employee = employee;
            this.empJoinTime = getEmpJoinTime(employee);
        }
}
class退休员工{
私人最终雇员;
私人最终选择时间;
退休员工(最终员工){
this.employee=employee;
this.empJoinTime=getEmpJoinTime(员工);
}
}
以下代码适用于:

List<Employee> to Map<String, List<Employee>>

employeesList.stream().collect(Collectors.groupingBy(Employee::getName));
要映射的列表
employeesList.stream().collect(Collectors.groupingBy(Employee::getName));
但不确定如何将此员工转换为此groupingBy中的新退休员工(Employee)或进一步流式处理

另外,我需要列表中最后一个员工id。是否有可能在流媒体中也有此功能

此外,希望为加入时间已知或存在的员工应用筛选器


谢谢

我可以想出两个选择。一种是使用收集器.mapping()来转换值:

employeesList.stream()
        .collect(Collectors.groupingBy(Employee::getName,
                Collectors.mapping(RetiredEmployee::new, Collectors.toList())))
使用Java9,您可以添加一个收集器来排除没有加入时间的员工

或者,您可以将流映射到
RetiredEmployee
,然后间接提取名称。这使得在加入时添加筛选器更容易:

employeesList.stream()
        .map(RetiredEmployee::new)
        .filter(e -> e.getEmpJoinTime().isPresent())
        .collect(Collectors.groupingBy(e -> e.getEmployee().getName()))

至于从名单中选出最后一名员工,我不认为有什么困难,也不知道这与streams有什么关系。只需使用
employeesList.get(employeesList.size()-1)

我可以想出两个选项。一种是使用收集器.mapping()来转换值:

employeesList.stream()
        .collect(Collectors.groupingBy(Employee::getName,
                Collectors.mapping(RetiredEmployee::new, Collectors.toList())))
使用Java9,您可以添加一个收集器来排除没有加入时间的员工

或者,您可以将流映射到
RetiredEmployee
,然后间接提取名称。这使得在加入时添加筛选器更容易:

employeesList.stream()
        .map(RetiredEmployee::new)
        .filter(e -> e.getEmpJoinTime().isPresent())
        .collect(Collectors.groupingBy(e -> e.getEmployee().getName()))

至于从名单中选出最后一名员工,我不认为有什么困难,也不知道这与streams有什么关系。只需使用
employeesList.get(employeesList.size()-1)

作为旁注-避免使用选项作为字段,它们只能在适当的情况下用作返回类型。没什么了。@Aominè我认为这是一个有争议的问题。@shmosel是真的,但我们应该始终努力推荐人们以正确的方式使用它。@Aominè“正确”在谁的观点中?@shmosel正如你提到的,这是一个有争议的问题,所以我们就这样吧;-)。作为旁注-避免使用选项作为字段,它们只能在适当的情况下用作返回类型。没什么了。@Aominè我认为这是一个有争议的问题。@shmosel是真的,但我们应该始终努力推荐人们以正确的方式使用它。@Aominè“正确”在谁的观点中?@shmosel正如你提到的,这是一个有争议的问题,所以我们就这样吧;-)。太棒了,谢谢。employeesList.get(employeesList.size()-1)可能不起作用,因为我想找到joinTime为其提供服务的最后一位员工。上面的流式处理还有其他方法吗?@user1578872您可以执行与上面相同的流,并
reduce((a,b)->b)
获取最后一个元素。或者收集到列表并使用
get()
。是否可以在同一个流迭代中获取加入时间存在的最后一名员工。employeesList.stream().map(RetiredEmployee::new).filter(e->e.getEmployee().isPresent()).collect(Collectors.groupingBy(e->e.getEmployee().getName())我不相信这是真的。太棒了,谢谢。employeesList.get(employeesList.size()-1)可能不起作用,因为我想找到joinTime所在的最后一位员工。上面的流式处理还有其他方法吗?@user1578872您可以执行与上面相同的流,并
reduce((a,b)->b)
获取最后一个元素。或者收集到列表并使用
get()
。是否可以在同一个流迭代中获取加入时间存在的最后一名员工。employeesList.stream().map(RetiredEmployee::new).filter(e->e.getEmpJoinTime().isPresent()).collect(Collectors.groupingBy(e->e.getEmployee().getName())我认为不是。