Guava使用之Ordering强大的流畅风格比较器
来源:互联网 发布:ubuntu 访客模式 编辑:程序博客网 时间:2024/04/28 01:48
排序器(Ordering)是Guava流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能。
从实现上说,Ordering实例就是一个特殊的Comparator实例。Ordering把很多基于Comparator的静态方法(如Collections.max)包装为自己的实例方法(非静态方法),并且提供了链式调用方法,来定制和增强现有的比较器。
常见的排序器可以用下面三个静态方法创建:natural(),usingToString(),from(Comparator)
另外,arbitrary():返回一个所有对象的任意顺序, 即compare(a, b) == 0 就是 a == b (identity equality)
示例代码:
@Testpublic void testStaticOrdering(){ List<String> list = Lists.newArrayList(); list.add("peida"); list.add("jerry"); list.add("harry"); list.add("eva"); list.add("jhon"); list.add("neron"); System.out.println("list:"+ list); Ordering<String> naturalOrdering = Ordering.natural(); Ordering<Object> usingToStringOrdering = Ordering.usingToString(); Ordering<Object> arbitraryOrdering = Ordering.arbitrary(); Ordering<String> fromOrdering = Ordering.from(new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }); System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list)); System.out.println("usingToStringOrdering:"+ usingToStringOrdering.sortedCopy(list)); System.out.println("arbitraryOrdering:"+ arbitraryOrdering.sortedCopy(list)); System.out.println("fromOrdering:"+fromOrdering.sortedCopy(list));}
实现自定义的排序器时,除了用上面的from方法,也可以跳过实现Comparator,而直接继承Ordering:
Ordering<String> stringOrdering = new Ordering<String>() { @Override public int compare(String left, String right) { return Ints.compare(left.length(),right.length()); }};
另外Ordering还有一个很强大的功能链式调用方法:通过链式调用,可以由给定的排序器衍生出其它排序器
例如,你需要下面这个类的排序器。
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进行自然排序。之所以要从后往前读,是因为每次链式调用都是用后面的方法包装了前面的排序器。
注意:如果排序的集合中有null元素的话,不能直接用静态的排序方法进行排序,否则出现空指针异常。
比如:
List<String> list = Lists.newArrayList();list.add("peida");list.add("jerry");list.add("harry");list.add("eva");list.add("jhon");list.add("neron");list.add(null);System.out.println("list:"+ list);Ordering<String> comparableOrdering = Ordering.natural().nullsFirst().onResultOf(new Function<String, String>() { @Override public String apply(String input) { return input; }});System.out.println(comparableOrdering.sortedCopy(list));
通过链式调用方法,先把null元素放在最前面,然后再对剩下的元素进行排序,这样不会抛NullPointerException是因为nullsFirstOrdering中的排序对null进行了处理
@Overridepublic int compare(@Nullable T left, @Nullable T right) { if (left == right) { return 0; } if (left == null) { return RIGHT_IS_GREATER; } if (right == null) { return LEFT_IS_GREATER; } return ordering.compare(left, right);}
- Guava使用之Ordering强大的流畅风格比较器
- [Google Guava] 排序: Guava强大的”流畅风格比较器”
- [Google Guava] 1.4 排序: Guava强大的”流畅风格比较器”
- [Google Guava] 1.4排序: Guava强大的”流畅风格比较器”
- Guava链式风格Ordering比较器实例
- Guava-流式风格比较器Ordering
- Java-类库-Guava-Ordering比较器
- Guava之Ordering
- Google Guava 工具集__3__ Ordering犀利的比较器 Object方法
- 强大的GUAVA之Strings
- Google Guava学习之Ordering
- Ordering犀利的比较器
- Guava使用笔记系列Ordering …
- 跟我学Guava:基础1.4-Ordering比较器和链式排序
- Guava的Ordering的一个API用法
- Google-Guava学习:排序器Ordering
- Guava(三):流畅的排序
- guava之比较器(1)
- 如何配置Maven?
- 主流框架(SSH及SSM)配置文件的模板头文件
- TortoiseSVN下载,安装, svn教程
- [ARM Cortex-A8]S5PV210裸板7寸LCD C程序
- 计算机网络基础
- Guava使用之Ordering强大的流畅风格比较器
- 设计模式(五)——抽象工厂模式
- Phone相关知识学习总结与梳理
- caffe训练自己的数据集——3. 数据处理
- java基本数据类型运算
- hikey开发板温湿度传感器(一)
- http协议
- 就是点随写
- antd mobile(十二) dva中使用mockJs