【问题标题】:How to ungroupify list of object to list of another object using java8如何使用java 8将对象列表取消组合为另一个对象列表
【发布时间】:2021-10-05 01:50:27
【问题描述】:

我有一个要求,我需要将 Department 列表转换为 DepartmentDetails 列表。 Department 有按 id 分组的员工和经理的数据。如何创建具有隔离信息的 DepartmentDetails 列表?

 Class Department {
     private  int id ;
     private List<Employee> employee;
     private List<Manager> manager;
    }
    
    Class Employee {
      private int empId;
      private String empName;
    }
    
    Class Manager{
    private int manId;
    private String manName;
    }


   Class DepartmentDetails {
   private int id ;
   private String personType ;
   private int personId;
  }

这里,Department Details 的 id 与 Department id 保持一致,personType 的值为 Manager/Employee,personId 的值为 empId/manId。

一种方法是遍历 List&lt;Department&gt; 并在其中遍历 List&lt;Managers&gt;List&lt;Employees&gt; ,使用 setter 创建所需的 DepartmentDetail 对象并添加到最终列表中。有没有更优雅的方法来实现这一点?

【问题讨论】:

    标签: arraylist lambda collections java-8 java-stream


    【解决方案1】:

    不确定为什么要编写此类层次结构。理想情况下,Manager 也是 Employee。如果这样做,Department 可以包含单个 List&lt;Employee&gt;

    另外,DepartmentDetails 的类型应为 Integer,对应 personId。要使用现有结构回答您的问题,我们可以将问题分解为多个较小的部分。

    1. 每个Department可以产生List&lt;DepartmentDetails&gt;

      公开课部{

      private int id;
      private List<Employee> employee;
      private List<Manager> manager;
      
      public List<DepartmentDetails> toDepartmentDetails() {
          return Stream.concat(employee.stream().map(e -> DepartmentDetails.builder().id(this.id).personType(
                      "Employee")
                  .personId(e.getEmpId()).build()),
              manager.stream().map(m -> DepartmentDetails.builder().id(this.id).personType("Manager")
                  .personId(m.getManId()).build())).collect(Collectors.toList());
      }
      
      }
      
    2. 使用flatMapList&lt;List&lt;DepartmentDetails&gt;&gt; 转换为List&lt;DepartmentDetails&gt;,同时遍历List&lt;Department&gt;

      List<DepartmentDetails> result =
              departments.stream().flatMap(department -> department.toDepartmentDetails().stream()).collect(Collectors.toList());
      

    【讨论】:

    • personId 的数据类型是错字。已编辑它。谢谢,这个答案是我需要的。
    猜你喜欢
    • 1970-01-01
    • 2022-10-17
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2013-08-14
    • 1970-01-01
    • 2018-09-03
    相关资源
    最近更新 更多