您可以使用分组收集器来做到这一点:
Map<String, Employee> topEmployees = allEmployees.stream() .collect(groupingBy( e -> e.department, collectingAndThen(maxBy(comparingInt(e -> e.salary)), Optional::get) ));
与静态导入
import static java.util.Comparator.comparingInt;import static java.util.stream.Collectors.collectingAndThen;import static java.util.stream.Collectors.groupingBy;import static java.util.stream.Collectors.maxBy;
此代码创建了
Stream所有员工的,并在的帮助下将其与部门分组
Collectors.groupingBy。对于分类为同一键的所有值,我们只需要保留薪水最高的员工,因此我们将其与
Collectors.maxBy进行比较,比较器会将薪金与进行比较
Comparator.comparingInt。由于
maxBy返回一个
Optional<Employee>(以处理列表为空的情况),我们通过调用来包装它,
Collectors.collectingAndThen并返回一个仅返回雇员的装订器:在这种情况下,我们知道可选内容不会为空。



