我上课
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方法,但无法正确解决。
寻求帮助。谢谢。
答案 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.collectingAndThen
和Collectors.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.*;