Guava链式风格Ordering比较器实例

 2023-09-05 阅读 226 评论 0

摘要:###1.简介 Ordering 实例无非就是一个特殊的Comparator 实例。Ordering只是需要依赖于一个比较器(例如,Collections.max)的方法,并使其可作为实例方法。另外,Ordering提供了链式方法调用和加强现有的比较器,可以轻松构造复杂的comp

###1.简介 Ordering 实例无非就是一个特殊的Comparator 实例。Ordering只是需要依赖于一个比较器(例如,Collections.max)的方法,并使其可作为实例方法。另外,Ordering提供了链式方法调用和加强现有的比较器,可以轻松构造复杂的comparator。 ###2.实例 场景是对一个list中的元素按照一定规则排序,首先我们新建一个TestOrder类:

import com.sun.istack.internal.Nullable;
import lombok.Data;@Data
public class TestOrder {@Nullableprivate Integer id;private String msg;public TestOrder(Integer id,String msg){this.id = id;this.msg = msg;}}
复制代码

我们要按照TestOrder中的ID进行排序,一般情况下有两种方式,一种就是循环 list并按照规则将TestOrder插入新的list;另一种方式是实现Comparable接口。我们使用Guava只需要如下代码:

@Testpublic void test(){TestOrder testOrder1 = new TestOrder(1,"test1");TestOrder testOrder2 = new TestOrder(2,"test2");TestOrder testOrder3 = new TestOrder(3,"test3");TestOrder testOrderNull = new TestOrder(null,"null");List<TestOrder> listResource = Lists.newArrayList(testOrderNull,testOrder1,testOrder3,testOrder2);System.out.println(listResource.toString());/******************************guava Ordering编写比较器*****************************/Ordering<TestOrder> ordering = Ordering.natural().nullsLast().onResultOf(new Function<TestOrder, Integer>() {public Integer apply(TestOrder testOrder) {return testOrder.getId();}});/******************************guava Ordering比较器结束*****************************/System.out.println(ordering.sortedCopy(listResource));}
复制代码

控制台输出为: [TestOrder(id=null, msg=null), TestOrder(id=1, msg=test1), TestOrder(id=3, msg=test3), TestOrder(id=2, msg=test2)] [TestOrder(id=1, msg=test1), TestOrder(id=2, msg=test2), TestOrder(id=3, msg=test3), TestOrder(id=null, msg=null)] 其中比较器部分就是我们的比较规则,然后调用ordering的sortedCopy方法就会返回一个按照比较器排序的list了。 那么为什么叫链式风格呢?比如我们写的这个比较器,要从最后的调用往前读,也就是: 1.执行apply方法得到ID 2. nullsLast把为ID为null的放到最后 3.按照ID的自然规则排,ID是数字也就是从小到大,时间等类型同理 所以如果是一个很复杂的比较器的话,链式风格就很易读了,清晰明了 ###3.参考 创建排序器:常见的排序器可以由下面的静态方法创建

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

操作方法:

reverse(): 返回与当前Ordering相反的排序:   nullsFirst(): 返回一个将null放在non-null元素之前的Ordering,其他的和原始的Ordering一样;   nullsLast():返回一个将null放在non-null元素之后的Ordering,其他的和原始的Ordering一样;   compound(Comparator):返回一个使用Comparator的Ordering,Comparator作为第二排序元素,例如对bug列表进行排序,先根据bug的级别,再根据优先级进行排序;   lexicographical():返回一个按照字典元素迭代的Ordering;   onResultOf(Function):将function应用在各个元素上之后, 在使用原始ordering进行排序;   greatestOf(Iterable iterable, int k):返回指定的第k个可迭代的最大的元素,按照这个从最大到最小的顺序。是不稳定的。   leastOf(Iterable iterable,int k):返回指定的第k个可迭代的最小的元素,按照这个从最小到最大的顺序。是不稳定的。   isOrdered(Iterable):是否有序,Iterable不能少于2个元素。   isStrictlyOrdered(Iterable):是否严格有序。请注意,Iterable不能少于两个元素。   sortedCopy(Iterable):返回指定的元素作为一个列表的排序副本。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/107.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息