zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

Google排序 比较 强大 风格 Guava 流畅
2023-09-11 14:16:10 时间

原文链接 译者: 沈义扬

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

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

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


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

Ordering String byLengthOrdering = new Ordering String () {

 public int compare(String left, String right) {

 return Ints.compare(left.length(), right.length());

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


考虑到排序器应该能处理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的排序器实现有若干操纵集合或元素值的方法


真正的缓存之王,Google Guava 只是弟弟(一) 前面刚说到Guava Cache,他的优点是封装了get,put操作;提供线程安全的缓存操作;提供过期策略;提供回收策略;缓存监控。当缓存的数据超过最大值时,使用LRU算法替换。这一篇我们将要谈到一个新的本地缓存框架:Caffeine Cache。它也是站在巨人的肩膀上-Guava Cache,借着他的思想优化了算法发展而来。 本篇博文主要介绍Caffine Cache 的使用方式,以及Caffine Cache在SpringBoot中的使用。
guava学习:guava集合类型-Bimap 学习guava让我惊喜的第二个接口就是:Bimap BiMap是一种特殊的映射其保持映射,同时确保没有重复的值是存在于该映射和一个值可以安全地用于获取键背面的倒数映射。 最近开发过程中,经常会有这种根据key找value或者根据value找key 的功能,之前都是将值存储到枚举或者map中,然后通过反转的写法来实现的,直到发现了Bimap,才发现原来还有这么简便的方式。