该方法旨在创建一个,它使用基于对象属性的顺序进行比较。当使用 lambda 表达式时,这是此处的简短编写,作为属性提供程序函数,结果将比较值本身。当要比较的对象具有自然顺序时,这有效。Comparator.comparing(…)
Comparator
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
之所以需要 a,是因为您正在使用可能包含任意对象的泛型类。max
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
因为 s 的自然顺序是词典顺序,其中 大于 哪个大于String
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)