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

标签: guava | 发表时间:2014-01-18 16:31 | 作者:沈义扬
出处:http://ifeve.com

原文链接 译者: 沈义扬

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

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

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

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

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

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

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

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

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

class Foo {
    @Nullable String sortedBy;
    int notSortedBy;
}

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

Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(
    new Function<Foo, String>() {
        public String apply(Foo foo) {
            return foo.sortedBy;
        }
    }
);

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

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

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

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)

(全文完)如果您喜欢此文请点赞,分享,评论。



您可能感兴趣的文章

相关 [google guava 排序] 推荐:

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

- - 并发编程网 - ifeve.com
原文链接 译者: 沈义扬. 排序器[Ordering]是Guava流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能. 从实现上说,Ordering实例就是一个特殊的Comparator实例. Ordering把很多基于Comparator的静态方法(如Collections.max)包装为自己的实例方法(非静态方法),并且提供了链式调用方法,来定制和增强现有的比较器.

Google Guava Collections 使用介绍

- 半兽人 - IBM developerWorks 中国 : Java technology : Articles,Tutorials
Google Guava Collections 是一个对 Java Collections Framework 增强和扩展的一个开源项目. 由于它高质量 API 的实现和对 JDK5 特性的充分利用,使得其在 Java 社区受到很高评价. 笔者主要介绍它的基本用法和功能特性.

Google Guava v11 Collections示例

- - 龙浩的blog
Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库. 这里先介绍一下最常用的com.google.common.collect包中的最常用的一些API,仅仅讨论一下API的使用方法,没有讨论到实现细节.      1:Collections的构造方法.

Google Guava官方教程(中文版)

- - Java - 编程语言 - ITeye博客
原文链接   译文链接  译者: 沈义扬, 罗立树,何一昕, 武祖   校对:方腾飞. Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等.

Guava cache

- - 孟飞阳的博客
Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制. 整体上来说Guava cache 是本地缓存的不二之选,简单易用,性能好.    Guava Cache有两种创建方式:.   通过这两种方法创建的cache,和通常用map来缓存的做法比,不同在于,这两种方法都实现了一种逻辑——从缓存中取key X的值,如果该值已经缓存过了,则返回缓存中的值,如果没有缓存过,可以通过某个方法来获取这个值.

Google Guava的5个鲜为人知的特性

- - Java译站
Google Guava有哪些比较冷门但却又实用的特性呢. 它是最流行的开源库之一,你应该听过它的大名,它诞生的地方正是人们举办真正的魁地奇比赛的地方(起码 实习期内是这样的). 它虽然不是来自哈利波特中的霍格沃兹学校,但却有着自己的专属魔力:Google Guava库包含着许多诞生于Google的核心Java库,这些都是公开发布后在生产环境经历过了各种检验的.

Java Cache系列之Guava Cache

- - BlogJava-首页技术区
然而作为工具库中的一部分,我们自然不能期待Guava对Cache有比较完善的实现. 因而Guava中的Cache只能用于一些把Cache作为一种辅助设计的项目或者在项目的前期为了实现简单而引入. 在Guava CacheBuilder的注释中给定Guava Cache以下的需求:. 对于这样的需求,如果要我们自己来实现,我们应该怎么设计.

[转][转]Redis、Memcached、Guava、Ehcache中的算法

- - heiyeluren的blog(黑夜路人的开源世界)
缓存那些事,一是内存爆了要用LRU(最近最少使用)、LFU(最少访问次数)、FIFO的算法清理一些;二是设置了超时时间的键过期便要删除,用主动或惰性的方法. 今天看 Redis3.0的发行通告里说,LRU算法大幅提升了,就翻开源码来八卦一下,结果哭笑不得,这旧版的"近似LRU"算法,实在太简单,太偷懒,太Redis了.

google专利揭示google新闻排序算法的10个潜在因素

- - 冰火岛
google专利揭示google新闻排序算法的10个潜在因素. 10 Breaking news score, which is measured as the ability of the news organization to publish a story soon after the event has occurred..

社交相关性排序:Google+ 的终极武器?

- rosa - 爱范儿 · Beats of Bits
用过 Buzz 的人都知道,除了暴露隐私的致命弱点,Buzz 还有一个让人讨厌无比的设计:有评论即置顶. 这使得某条信息不断侵占你的时间线. 在刚开放注册的几天,使用 Google+ 也会出现同样的情况,如果你在某条信息发表了一条评论,那么只要别人也发表评论,这条信息就会上升到你的时间线顶部. 难道是 Buzz 的噩梦再现.