[英]Finding Max with Lambda Expression in Java
这是我的代码
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
我不能让两者之间distingues i
在下面我的代码段
Comparator.comparing(i -> i)
任何人都可以善良并解释两个i
之间的区别吗?
Comparator.comparing(…)
方法旨在创建一个Comparator
,它使用基于对象属性的顺序进行比较。 当使用lambda表达式i -> i
,这是(int i) -> { return i; }
的简写(int i) -> { return 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
之所以需要Comparator
,是因为你使用的泛型类Stream
可能包含任意对象。
这允许,例如像streamOfPoints.max(Comparator.comparing(p->px))
一样使用它来查找具有最大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
因为String
s的自然顺序是字典顺序,其中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
as aaa
具有流中所有String
的最大长度 。 这是Comparator.comparing
的预期用例,在使用方法引用时可以使其更具可读性,即Comparator.comparing(String::length)
几乎可以说明自己...
这个函数(注意->
用于闭包,不要与=>
混淆,用于比较)
i -> i
只是意味着您需要按原样比较整个对象。 也就是说,如果我有一个i
需要比较i
一个不太重要的例子可能是
max(Comparator.comparing(i -> -i))
这将给你最小或
max(Comparator.comparing(i -> Math.abs(100-i))
给你一个距离100最远的值。
max(Comparator.comparing(i -> i.toString()))
这将给你最大的比较作为一个字符串,即“9”>“10”作为一个字符串。
Comparator.comparing
需要一个将源对象映射到实际得到的值的函数 - 在您的情况下,因为您不想预处理要比较的值,所以i
只是映射到自身。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.