前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java知识点——Comparator比较器

Java知识点——Comparator比较器

作者头像
用户7073689
发布2020-03-18 16:30:03
1.3K0
发布2020-03-18 16:30:03
举报
文章被收录于专栏:青柠小鱼

Comparator接口包含很多方便的静态方法来创建比较器。这些方法可以用于lambda达 式或方法引用。

静态comparing方法取一个“键提取器”函数,它将类型T映射为一个可比较的类型(如String) 对要比较的对象应用这个函数,然后对返回的键完成比较。例如,假设有一个Person对象数组,可以按名字对这些对象偶排序: Array.sort(people, Comparator.comparing(Peron::getName); 与手动实现一个Comparator相比,这当然要容易得多。另外,代码也加 清晰,因为显然我们都是按照人名来进行比较。 可以把比较器与thenComparing方法串起来,例如: Array.sort(people, Comparator.comparing(Peron::getLastName) .thenComparing(Peron::getFirstName)); 如果两个人的姓相同,就会使用第二个比较器。 这些方法有很多变体形式。可以为comparing和thenComparing方法提取的键指定一个比较器,例如,可以如下根据人名长度进行排序: Array.sort(people, Comparator.comparing(Peron::getName, (s, t) -> Integer.compare(s.length(), t.length()); 另外,comparing和thenComparing方法都有变体形式,可以避免int、long或者double值得装箱,要完成前一个操作,还有一种更加容易的做法: Arrays.sort(people, Comparator.comparingInt(p -> p.getName().length())); 如果函数可以返回null,可能就要用到nullsFirst和nullLast适配器。这些静态方法会修改现有的比较器,从而在遇到null是不会抛出异常,而是将这个值标记为小于或大于正常值。例如,假设一个人没有中名时getMiddleName会返回一个null,就可以使用 Comparator.comparing(Person::getMiddleName(),Comparator.nullsFirst(…))

nullFirst方法需要一个比较器,在这里就是比较两个字符串的比较器,naturalOrder 可以为任何实现了Comparable的类建立一个比较器。在这里,Comparator.naturalOrder() 正是我们需要的。下面是一个完整的调用,可以按可能为null的中文名进行排序。 这里使用了一个静态导入java.util.Comparator.*,以便于理解这个表达式。注意naturalOrder的类型可以推导得出。 Arrays.sort(people, comparing(Person::getMiddleName, nullsFirst(naturalOrder())); 静态reverseOrder方法会提供自然顺序的逆序。要让比价器逆序比较,可以使用reversed实例方法,例如naturalOrder().reversed()等同于reverseOrder()。

我的同学总结的特别好,借鉴一下: https://blog.csdn.net/qq_40197991/article/details/104928742

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档