本文地址:http://www.cnblogs.com/hamhog/p/3537233.html

示例

assertTrue(byLengthOrdering.reverse().isOrdered(list));

概述

Ordering 是Guava的"流畅版" Comparator ,它用来构建高级comparator,并把comparator应用于各种集合(collection)。

本质上, Ordering 实例不过是一个特殊的 Comparator 实例。 Ordering 所做的就是把那些依赖于 Comparator 的方法(例如, Collections.max) 改写为成员方法。另外, Ordering 类提供一些可链式调用的方法,用来调整和增强已有的comparator。

创建Ordering

Ordering对象一般由以下静态方法创建:

方法 描述
natural() 在Comparable类型上应用自然排序(natural ordering)。
usingToString() 将对象的toString()返回值按字典序排序。

想要将已有的 Comparator 转化为 Ordering ,只需使用 Ordering.from(Comparator) 。

但是创建 Ordering 更常规的做法是完全忽略 Comparator ,直接扩展 Ordering 抽象类:

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

链式调用

可以通过包装 Ordering 来进行一些预处理。一些最常见的处理如下:

方法 描述
reverse() 返回逆序的Ordering。
nullsFirst() 返回的 Ordering 将null元素排在非null元素前面,其余部分的排序规则与原始的 Ordering 相同。nullsLast()同理。
compound(Comparator) 返回的 Ordering 对之前每组相等的元素用指定的 Comparator 再排序。
lexicographical() 返回的 Ordering 对iterable的元素按字典序排序。
onResultOf(Function) 返回的 Ordering 将被排序的元素传入function,对返回值用原始的 Ordering排序。

举例来说,假设你希望创建下面这个类的 comparator ...

classFoo{
@NullableString sortedBy;
int notSortedBy;
}

...并且希望它能在 sortedBy 基础上处理null值。下面是应用链式调用的解决方案:

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

看 Ordering 的链式调用代码,要从右往左“倒序”看。上面这个例子将 Foo 类型的对象按它们 sortedBy 属性的值排序:首先把所有 sortedBy 属性为null的对象排到最前面,然后对其余对象按自然字符串序(natural string ordering)排序。之所以是这样倒序进行,是因为每次链式调用是把原先的 Ordering 包装在新的 Ordering 中

(“倒序”规则有一个例外: 涉及 compound 的链式调用,应该从左往右看。为了避免混淆,不要把 compound 调用和其他链式调用混合处理。)

连续几次的链式调用可能不容易理解。我们建议把调用链的长度限制在3次调用之内,就像上面的例子这样。在这基础上,你还可以用 Function 等存储排序的中间结果,从而进一步简化代码。

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

应用

Guava 提供了一些方法使用 Ordering 来处理、检查值和collection对象。我们列出最常用的如下:

方法 描述 同理可见
greatestOf(Iterable iterable, int k) 根据ordering的排序规则,返回参数 iterable 的k个最大值。不稳定排序。 leastOf
isOrdered(Iterable) 检查指定的 Iterable 根据ordering的排序规则是否有序(单调非减)。 isStrictlyOrdered
sortedCopy(Iterable) 将指定元素的排序结果存入 List 返回。 immutableSortedCopy
min(E, E) 根据ordering的排序规则,返回两个参数中的较小者。如果两者相等,则返回第一个参数。 max(E, E)
min(E, E, E, E...) 根据ordering的排序规则,返回两个参数中的较小者。如果有多个相等的最小值,则返回第一个。 max(E, E, E, E...)
min(Iterable) 返回参数 Iterable 最小值。如果这个 Iterable 是空的,则返回 NoSuchElementException 。 max(Iterable)min(Iterator),max(Iterator)

中文翻译自Guava官方文档:GuavaExplained - OrderingExplained   译者:戴仓薯

[Guava官方文档翻译] 4. 使用Guava Ordering排序 (Ordering Explained)的更多相关文章

  1. [Guava官方文档翻译] 6. 用Guava辅助Throwable异常处理 (Throwables Explained)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537508.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...

  2. [Guava官方文档翻译] 7. Guava的Immutable Collection(不可变集合)工具 (Immutable Collections Explained)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3538666.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...

  3. [Guava官方文档翻译] 5. Guava的Object公共方法 (Common Object Utilities Explained)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537367.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  4. [Guava官方文档翻译] 2.使用和避免使用null (Using And Avoiding Null Explained)

    本文地址:http://www.cnblogs.com/hamhog/p/3536647.html "null很恶心." -Doug Lea "这是一个令我追悔莫及的错误 ...

  5. [Guava官方文档翻译] 1.Guava简介 (Introduction)

    用户指南 Guava包含Google在Java项目中用到的一些核心库:collections, caching, primitives support, concurrency 库, common a ...

  6. [Guava官方文档翻译] 3. 前置条件检查(Preconditions Explained)

    本文地址:http://www.cnblogs.com/hamhog/p/3536964.html 前置条件检查 Guava提供了一些检查前置条件的utilities.我们强烈建议静态import这些 ...

  7. Guava ---- Ordering排序工具

    使用Guava的排序工具类, 高速实现对象的单变量排序和多变量排序, 让你的开发效率爆炸... import com.google.common.collect.Lists; import com.g ...

  8. Google Guava官方教程(中文版)

    Google Guava官方教程(中文版) 原文链接  译文链接 译者: 沈义扬,罗立树,何一昕,武祖  校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库, ...

  9. [转]Google Guava官方教程(中文版)

    Google Guava官方教程(中文版) http://ifeve.com/google-guava/

随机推荐

  1. WIN32不得不会:视频播放器

    我愿分享我所有的技术,你可愿意做我的朋友? ----赵大哥 为何要写这篇博客 纯WIN32API打造,自认为对底层的理解略有帮助,和大家分享成果和知识点. 已经实现功能有:打开.播放.关闭功能. 核心 ...

  2. ios常用动画

    // // CoreAnimationEffect.h // CoreAnimationEffect // // Created by VincentXue on 13-1-19. // Copyri ...

  3. HDU 5476 Explore Track of Point 数学平几

    Explore Track of Point Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem ...

  4. 2015北京网络赛 H题 Fractal 找规律

    Fractal Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc2015beijingo ...

  5. com.domain.bean

    package com.domain.bean; import java.util.LinkedHashMap; import java.util.Map; public class TmpBean ...

  6. Input

    Input Basic Input Old Input Files Please note that both Input and Request do NOT sanitize your data, ...

  7. ExtJs 下拉菜单分页工具插件 代码分析

    Ext.ns("Ext.ux"); //创建插件对象 Ext.ux.PageSizePlugin = function(){ //调用父对象的构造方法,并为此插件生成一个预定义st ...

  8. Creader VIII VS. Creader VII+

    Launch x431 diagun is professional universal auto diagnostic tool which designed and developed by LA ...

  9. Android(java)学习笔记121:android.intent.action.MAIN 与 android.intent.category.LAUNCHER 理解

    先看看网路上的说法: android.intent.action.MAIN决定应用程序最先启动的 Activity android.intent.category.LAUNCHER决定应用程序是否显示 ...

  10. 使用Jsoup帮助解析具有html标签的数据和解析网页

    下载Jsoup包后导入 /** * Created by YGW on 2016/4/17. * 显示公告的详细内容 */public class PressFragment extends Frag ...