原文链接 译者: 沈义扬

排序器[Ordering]是Guava流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能。

从实现上说,Ordering实例就是一个特殊的Comparator实例。Ordering把很多基于Comparator的静态方法(如Collections.max)包装为自己的实例方法(非静态方法),并且提供了链式调用方法,来定制和增强现有的比较器。

创建排序器:常见的排序器可以由下面的静态方法创建

方法 描述
natural() 对可排序类型做自然排序,如数字按大小,日期按先后排序
usingToString() 按对象的字符串形式做字典排序[lexicographical ordering]
from(Comparator) 把给定的Comparator转化为排序器

实现自定义的排序器时,除了用上面的from方法,也可以跳过实现Comparator,而直接继承Ordering:

1 Ordering<String> byLengthOrdering = new Ordering<String>() {
2   public int compare(String left, String right) {
3     return Ints.compare(left.length(), right.length());
4   }
5 };

链式调用方法:通过链式调用,可以由给定的排序器衍生出其它排序器

方法 描述
reverse() 获取语义相反的排序器
nullsFirst() 使用当前排序器,但额外把null值排到最前面。
nullsLast() 使用当前排序器,但额外把null值排到最后面。
compound(Comparator) 合成另一个比较器,以处理当前排序器中的相等情况。
lexicographical() 基于处理类型T的排序器,返回该类型的可迭代对象Iterable<T>的排序器。
onResultOf(Function) 对集合中元素调用Function,再按返回值用当前排序器排序。

例如,你需要下面这个类的排序器。

1 class Foo {
2     @Nullable String sortedBy;
3     int notSortedBy;
4 }

考虑到排序器应该能处理sortedBy为null的情况,我们可以使用下面的链式调用来合成排序器:

1 Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(newFunction<Foo, String>() {
2   public String apply(Foo foo) {
3     return foo.sortedBy;
4   }
5 });

当阅读链式调用产生的排序器时,应该从后往前读。上面的例子中,排序器首先调用apply方法获取sortedBy值,并把sortedBy为null的元素都放到最前面,然后把剩下的元素按sortedBy进行自然排序。之所以要从后往前读,是因为每次链式调用都是用后面的方法包装了前面的排序器。

注:用compound方法包装排序器时,就不应遵循从后往前读的原则。为了避免理解上的混乱,请不要把compound写在一长串链式调用的中间,你可以另起一行,在链中最先或最后调用compound。

超过一定长度的链式调用,也可能会带来阅读和理解上的难度。我们建议按下面的代码这样,在一个链中最多使用三个方法。此外,你也可以把Function分离成中间对象,让链式调用更简洁紧凑。

1 Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(sortKeyFunction)

运用排序器:Guava的排序器实现有若干操纵集合或元素值的方法

方法 描述 另请参见
greatestOf(Iterable iterable, int k) 获取可迭代对象中最大的k个元素。 leastOf
isOrdered(Iterable) 判断可迭代对象是否已按排序器排序:允许有排序值相等的元素。 isStrictlyOrdered
sortedCopy(Iterable) 判断可迭代对象是否已严格按排序器排序:不允许排序值相等的元素。 immutableSortedCopy
min(E, E) 返回两个参数中最小的那个。如果相等,则返回第一个参数。 max(E, E)
min(E, E, E, E...) 返回多个参数中最小的那个。如果有超过一个参数都最小,则返回第一个最小的参数。 max(E, E, E, E...)
min(Iterable) 返回迭代器中最小的元素。如果可迭代对象中没有元素,则抛出NoSuchElementException。 max(Iterable), min(Iterator), max(Iterator)

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: [Google Guava] 排序: Guava强大的”流畅风格比较器”

from: http://ifeve.com/google-guava-ordering/

[Google Guava] 排序: Guava强大的”流畅风格比较器”相关推荐

  1. guava排序器Ordering

    目录 1. 排序器的创建 2. 剖析与原生排序的区别 3. 链式调用 3.1 reverse() 3.2 nullsFirst()/nullsLast() 4 运用排序器 4.1 isOrdered ...

  2. Google 出的 Guava 是个什么鬼

    转载自   Google 出的 Guava 是个什么鬼 前言 Google 出的 Guava 是 Java 核心增强的库,应用非常广泛. 我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看 ...

  3. Google 出的 Guava 是个什么鬼?

    前言 Google 出的 Guava 是 Java 核心增强的库,应用非常广泛. 我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的. 缓存 本次主要讨 ...

  4. guava之guava cache

    一说到缓存,有没有脑海里立马想到的是guava cache.ehcache.redis.memerycache等等这些和缓存相关的技术实现,计算机专业出生可能还会想到cpu的一级缓存.二级缓存.三级缓 ...

  5. Guava 系列 - Guava基础

    文章目录 Guava 系列 - Guava基础 1.是什么 2.如何构建 3.用户文档 4.为什么选择使用guava Guava 系列 - Guava基础 1.是什么 guava 是一个开源的java ...

  6. java guava eventbus_JAVA | Guava EventBus 使用

    JAVA | Guava EventBus 使用 系列文章目录 Table of Contents [TOC] 前言 EventBus 是 Guava 的事件处理机制,是观察者模式(生产/消费模型)的 ...

  7. Google Guava 工具集__3__ Ordering犀利的比较器 Object方法

    Google Guava 工具集 博客栏目链接:Google Guava 博客栏目 博客栏目涉及演示代码 GitHub 地址: 点击打开Guava 演示代码包 Ordering是Guava类库提供的一 ...

  8. 【Java 代码实例 10】Google核心库GUAVA

  9. Guava学习笔记:Ordering犀利的比较器

    2019独角兽企业重金招聘Python工程师标准>>> Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比 ...

最新文章

  1. 在CentOS 6.9 x86_64的nginx 1.12.2上开启ngx_req_status模块实录
  2. AI模型加速进入万亿级时代,中国AI算力独占全球三成
  3. 在Windows下使用make命令
  4. MLP多层感知机 学习笔记
  5. c语言注释换颜色,C语言实现注释转换
  6. 数据结构(四)之冒泡排序
  7. 「轻阅读」基于 Flink SQL CDC的实时数据同步方案,附视频教程
  8. Python求水仙花数
  9. PHP 实现防抖功能(防重复请求)
  10. ios 应用闪退原因
  11. 如何彻底删除打印机驱动程序
  12. KeyShot 实时光线追踪三维渲染软件
  13. 传感器采集数据 Python123
  14. 计算机关于剪贴板的知识,复制、剪切、粘贴与剪贴板、内存的关系
  15. 没有内容的文集,竟然是不存在的
  16. 用云盘搭建自己的内容平台
  17. 如何在网站中加入qq咨询
  18. ewfmgr开启保护后无法关闭的问题
  19. amd处理器更新zen4服务器芯片,AMD将推出64 核心Zen 4处理器,整体性能提升了40%...
  20. org 0x7c00解疑

热门文章

  1. Java泛型总结--转
  2. jdk8中java.util.concurrent包分析
  3. zookeeper源码分析之三客户端发送请求流程
  4. Hudson-ci/Installing Hudson Windows Service---官方文档
  5. LESSON 3 线性回归的手动实现
  6. 机器学习算法基础——决策树和随机深林
  7. 在程序中进行make以后出现的一些错误以及解决方法
  8. pack()函数中类型对应的符号标记
  9. BERT却不懂Transformer?2021
  10. quartz mysql 建表_quartz创建表语句