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

方法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完全需要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

因为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

因为aaa具有流中所有String的最大长度。这是Comparator.comparing的预期用例,在使用方法引用时可以使其更具可读性,即Comparator.comparing(String::length)几乎可以说明自己......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值