class Employee {
public string department;
public int salary;
}
List<Employee> allEmployees = ...
我需要有一个 list ,每个部门只有一名最高薪水雇员。所有员工是源列表。 最佳答案
您可以使用分组收集器来做到这一点:
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
的调用包装了它:在这种情况下,我们知道可选内容不会为空。