Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在列表中使用.max()和.stream()<&燃气轮机;_Java_List_Java 8_Max_Java Stream - Fatal编程技术网

Java 在列表中使用.max()和.stream()<&燃气轮机;

Java 在列表中使用.max()和.stream()<&燃气轮机;,java,list,java-8,max,java-stream,Java,List,Java 8,Max,Java Stream,我想要求对一些代码进行解释,这些代码是我在Java课程中做的一个练习的解决方案。 练习是,我有一个具有各种属性(工资、姓名、姓氏、电子邮件等)的员工的列表,我正在尝试检索工资最高的员工,并打印他们的姓名和工资 我能够检索到最高工资,但无法检索到员工的姓名,如下所示: Integer maxSalary; maxSalary = roster .stream() .map(Employee :: getSalary) .collect(Collectors.reducing

我想要求对一些代码进行解释,这些代码是我在Java课程中做的一个练习的解决方案。 练习是,我有一个具有各种属性(工资、姓名、姓氏、电子邮件等)的员工的
列表,我正在尝试检索工资最高的员工,并打印他们的姓名和工资

我能够检索到最高工资,但无法检索到员工的姓名,如下所示:

Integer maxSalary;
maxSalary = roster
    .stream()
    .map(Employee :: getSalary)
    .collect(Collectors.reducing(Integer :: max)
    .get();
然后我得到了这一小块代码,它工作得非常好,但我不太清楚它为什么工作:

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.");

我知道这是一个Lambda表达式,使用的是
.max
,我就是想不明白它为什么工作以及如何工作?

max
使用一个函数来比较元素

(p1, p2) -> Integer.compare(p1.getSalary(), p2.getSalary())
是lambda-用于比较每个元素的薪资信息,以找到最大值。

函数:

根据提供的比较器返回此流的最大元素。这是一种特殊的减少

由于它是一个功能接口,只有
比较(to1,to2)
才能实现,因此可以用lambda表示。这里,lambda
(p1,p2)->Integer.compare(p1.getSalary(),p2.getSalary())
使用标准整数比较将
p1
的薪资与
p2
的薪资进行比较。因此,结果将是工资最高的员工

Optional<T> max(Comparator<? super T> comparator);
因此,当调用
max()
时,您可以向它传递一个lambda,该lambda作为参数2
Employee
,因为流的类型是
Employee
,并提供两个
Employee
对象的比较实现,因为
int compare(Employee o1,Employee o2)
期望:

.max((p1, p2) -> Integer.compare(p1.getSalary(), p2.getSalary()))

这很简单:在您的解决方案中,您将员工转换为他们的工资,然后在数字中找到最大值。在第二个(也是正确的)解决方案中,您不执行任何转换:您根据特定标准比较员工本身。你的标准是薪水。因此,
max()
最终得到的不是max数字,而是“max employee”(按工资计算)。

解释了这一切

由于问题的目的是找到工资最高的员工,因此流直接传递到
.max
,它使用员工
比较器。由于
比较器
是功能接口,因此它可以作为lambda传入。
.max
已经实现了自java 8以来可用的更通用的
reduce
collect
操作版本

比较两个整数。因此,
.max()
返回工资最高的员工

Optional<T> max(Comparator<? super T> comparator);
另一方面,你的努力是为了获得最高的薪水

Optional<T> max(Comparator<? super T> comparator);

干杯。快乐流。

将列表抓取到一个流中(隐藏通过列表的循环),并获取
max()
-它通过比较元素
p1
和元素
p2
,每个元素都是列表中的下一个和上一个项目(在浏览时),并对这两个项目进行比较。比较结果(两个数字之间)被传递到下一步(成为下一次比较中的上一项),并使用列表中的下一个元素进行计算。同样,循环是隐藏的,你看不见的循环是什么在做我的头,我曾想过,但似乎找不到任何这样的建议。谢谢大家。我会将比较行替换为:max(Comparator.comparingit(Employee::getSalary))不要无条件地使用
get()
——如果流为空,它将抛出。使用安全的
可选方法之一--
orElse()
orelsetrow()
等处理空流问题。