在Java中使用Lambda表达式查找Max

这是我的代码

    List<Integer> ints = Stream.of(1,2,4,3,5).collect(Collectors.toList());

Integer maxInt = ints.stream()

.max(Comparator.comparing(i -> i))

.get();

System.out.println("Maximum number in the set is " + maxInt);

输出:

Maximum number in the set is 5

我无法i在我的代码的以下部分中区分两者

Comparator.comparing(i -> i)

有人能和be并解释两者的区别i吗?

回答:

该方法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))来查找具有最大值的点,xPoint其本身没有自然顺序。或者做类似的事情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)几乎可以说明一切……

以上是 在Java中使用Lambda表达式查找Max 的全部内容, 来源链接: utcz.com/qa/431326.html

回到顶部