在List <>上使用.max()和.stream()

col*_*lin 3 java list max java-8 java-stream

我想请求一些代码的解释,我将其作为我在Java课程中进行的练习的解决方案.练习是我有一个List<>具有各种属性(薪水,姓名,姓氏,电子邮件......)的员工,我正在尝试检索收入最高的员工并打印他们的姓名和薪水.

我能够检索最高薪水而不是员工姓名,如下所示:

Integer maxSalary;
maxSalary = roster
    .stream()
    .map(Employee :: getSalary)
    .collect(Collectors.reducing(Integer :: max)
    .get();
Run Code Online (Sandbox Code Playgroud)

然后给了我这个小块的代码,它完全正常,但我不太清楚为什么它的工作原理:

Integer maxSalary;
Employee emp2 = roster
    .stream()
    .max((p1, p2) -> Integer.compare(p1.getSalary(), p2.getSalary()))
    .get();
System.out.println("The employee who earns the most is :" + emp2.getName + " and earns : " + emp2.getSalary + " a month.");
Run Code Online (Sandbox Code Playgroud)

我明白这是一个Lambda表达式使用.max我似乎无法理解为什么以及如何工作?

Dot*_*ta2 5

Optional<T> max(Comparator<? super T> comparator) 解释一切.

由于问题的目的是找到薪水最高的员工,因此直接传递给.max消费员工的员工comparator.由于comparator是功能接口,它可以作为lambda传入. .max已经实现了自Java 8以来更通用reducecollect可操作的版本

Integer.compare比较两个int数字.因此,.max()返回薪水最高的员工.

另一方面,你的尝试是专门试图获得最高薪水.

干杯.快乐流媒体.