【问题标题】:Java 8 comparison of 2 different listsJava 8 2 个不同列表的比较
【发布时间】:2020-12-16 00:47:21
【问题描述】:

在使用 java 8 迭代和比较 2 个不同的列表时,我需要帮助。如果其中一个属性匹配,那么我需要将一个列表的值设置为另一个。一个员工可以有多个项目。 EmployeeDto{ --列表
名称
ID 数字 项目列表}

我有一个列表项目列表
项目Dto {
ID, 项目名称....}

我想比较employeeList 和projectList。检查两个列表中的 Id 是否匹配然后设置 employeeDto.setProjectList(projectList)

         List<ProjectDto> newList = new Arraylist<>();
         for(EmployeeDto emp: employeeList) {
         for(ProjectDto project: ProjectList){

           if(project.getId().equals(emp.getId())){

               newList.add(project);

             }
             emp.setProjectList(newList));
           }

提前致谢

【问题讨论】:

  • 到目前为止你尝试了什么?
  • for(EmployeeDto dto: employeeList){ projectList.stream().filter(x--> x.getid.equals(dto.getId().map(dto.setProjectList(x))) )。由于这是一个列表,因此我不确定 .map 条件。我知道这是错误的。我想将项目添加到列表中,然后将其设置为employeedto

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


【解决方案1】:
employeeList.forEach(employee -> {
  employee.setProjectList(projectList.stream()
    .filter(project -> Objects.equals(employee.getId(), project.getId()))
    .collect(Collectors.toList()));
}); 

这是一种可能的方法。

【讨论】:

    【解决方案2】:

    没有必要做O(n^2)的工作。您可以先按 emp ID 对项目进行分组。

    Map<String, List<ProjectDto>> grouped = projects.stream().collect(groupingBy(ProjectDto::getId, toList()));
    

    然后简单地遍历您的员工并为每个员工设置相应的 projectList。

    employees.forEach(emp -> emp.setProjectList(grouped.getOrDefault(emp.getId(), new ArrayList<>())));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 2021-01-14
      • 2013-07-20
      相关资源
      最近更新 更多