Java 8根据对象列表创建地图

时间:2018-12-18 06:42:55

标签: java collections java-8 java-stream

我上课

Class Employee {

    String company;
    String deptId;
    Double salary;

    // other fields
    // constructors
    // setters n getters      
} 

然后我以某种方式获得该课程的清单:

List<Employee> employees = getAllEmployees();

现在我希望输出为地图。

Map<String, Map<String, Double>> companyVsDeptVsMaxSalary = employees.stream()........

因此,我想拥有一个Map,其中我的密钥是公司,并以其他Map的价格进行评估。

现在其他内部Map是部门的Map与该部门的最高工资之比。

我可以使用样板代码来做到这一点。

但是需要探索Java 8以获得简洁的更好的代码。 我尝试了其他的collectionAndThen方法,但无法正确解决。

寻求帮助。谢谢。

2 个答案:

答案 0 :(得分:0)

这可以解决问题:

Map<String, Map<String, Double>> map =
    employees.stream().collect(
        groupingBy(Employee::getCompany,
            groupingBy(Employee::getDeptId,
                 collectingAndThen(
                     maxBy(comparing(Employee::getSalary)),
                     o -> o.get().getSalary())));

此代码段的想法是先由公司映射您的员工,然后再由 deptId 映射。最后,我们使用Collectors.collectingAndThenCollectors.maxBy方法来计算每个公司的最高薪水和deptId。

答案 1 :(得分:0)

您要按company分组,然后按depthId分组,最后,选择内部分组的最高薪水。

这可以通过groupingBy并减少收集器来完成:

Map<String, Map<String, Double>> result = 
     employees.stream()
              .collect(groupingBy(Employee::getCompany,
                              groupingBy(Employee::getDeptId,
                                     reducing(0D, Employee::getSalary,
                                             maxBy(comparingDouble(e -> e))))));

进口:

import java.util.stream.*;
import static java.util.stream.Collectors.*;
import static java.util.function.BinaryOperator.maxBy;
import static java.util.Comparator.*;