该方法
Comparator.comparing(…)旨在创建一个
Comparator使用基于对象属性的订单进行比较的。当使用lambda表达式
i-> i(这是
(int i) -> { return i;}此处的简短写法)作为属性提供程序函数时,结果Comparator将比较值本身。这工作时,要比较的对象有一个 自然秩序 的
Integer了。
所以
Stream.of(1,2,4,3,5).max(Comparator.comparing(i -> i)).ifPresent(maxInt->System.out.println("Maximum number in the set is " + maxInt));与…相同
Stream.of(1,2,4,3,5).max(Comparator.naturalOrder()).ifPresent(maxInt->System.out.println("Maximum number in the set is " + maxInt));尽管后者更有效,因为它对于具有自然顺序的所有类型都实现为单例(和实现
Comparable)。
根本
max不需要a 的原因
Comparator是因为您使用的泛型类
Stream可能包含任意对象。
这允许(例如)使用它
streamOfPoints.max(Comparator.comparing(p->p.x))来查找具有最大值的点,
x而
Point其本身没有自然顺序。或者做类似的事情
streamOfPersons.sorted(Comparator.comparing(Person::getAge))。
使用专家时,
IntStream您可以直接使用自然顺序,这可能会更有效:
IntStream.of(1,2,4,3,5).max().ifPresent(maxInt->System.out.println("Maximum number in the set is " + maxInt));为了说明“自然顺序”与基于属性的顺序之间的区别:
Stream.of("a","bb","aaa","z","b").max(Comparator.naturalOrder()).ifPresent(max->System.out.println("Maximum string in the set is " + max));这将打印
集合中的最大字符串为z
因为
Strings 的自然顺序是字典顺序,其中
z大于
b大于大于
a
另一方面
Stream.of("a","bb","aaa","z","b").max(Comparator.comparing(s->s.length())).ifPresent(max->System.out.println("Maximum string in the set is " + max));将打印
集合中的最大字符串为aaa
如流中所有s
aaa的最大
长度
String。这是一个预期的用例,
Comparator.comparing使用方法引用时可以使其更具可读性,即
Comparator.comparing(String::length)几乎可以说明一切……



