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 的调用包装了它:在这种情况下,我们知道可选内容不会为空。

10-07 22:53