1.簡(jiǎn)介
Ordering 實(shí)例無(wú)非就是一個(gè)特殊的Comparator 實(shí)例厌处。Ordering只是需要依賴于一個(gè)比較器(例如轻姿,Collections.max)的方法腹尖,并使其可作為實(shí)例方法驾茴。另外架专,Ordering提供了鏈?zhǔn)椒椒ㄕ{(diào)用和加強(qiáng)現(xiàn)有的比較器,可以輕松構(gòu)造復(fù)雜的comparator押桃。
2.實(shí)例
場(chǎng)景是對(duì)一個(gè)list中的元素按照一定規(guī)則排序葵萎,首先我們新建一個(gè)TestOrder類:
import com.sun.istack.internal.Nullable;
import lombok.Data;
@Data
public class TestOrder {
@Nullable
private Integer id;
private String msg;
public TestOrder(Integer id,String msg){
this.id = id;
this.msg = msg;
}
}
我們要按照TestOrder中的ID進(jìn)行排序,一般情況下有兩種方式唱凯,一種就是循環(huán) list并按照規(guī)則將TestOrder插入新的list羡忘;另一種方式是實(shí)現(xiàn)Comparable接口。我們使用Guava只需要如下代碼:
@Test
public 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比較器結(jié)束
*****************************/
System.out.println(ordering.sortedCopy(listResource));
}
控制臺(tái)輸出為:
[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)]
其中比較器部分就是我們的比較規(guī)則磕昼,然后調(diào)用ordering的sortedCopy方法就會(huì)返回一個(gè)按照比較器排序的list了卷雕。
那么為什么叫鏈?zhǔn)斤L(fēng)格呢?比如我們寫的這個(gè)比較器票从,要從最后的調(diào)用往前讀漫雕,也就是:
1.執(zhí)行apply方法得到ID
- nullsLast把為ID為null的放到最后
3.按照ID的自然規(guī)則排滨嘱,ID是數(shù)字也就是從小到大,時(shí)間等類型同理
所以如果是一個(gè)很復(fù)雜的比較器的話浸间,鏈?zhǔn)斤L(fēng)格就很易讀了太雨,清晰明了
3.參考
創(chuàng)建排序器:常見的排序器可以由下面的靜態(tài)方法創(chuàng)建
| 方法 | 描述 |
| natural() | 對(duì)可排序類型做自然排序,如數(shù)字按大小魁蒜,日期按先后排序 |
| usingToString() | 按對(duì)象的字符串形式做字典排序[lexicographical ordering] |
| from(Comparator) | 把給定的Comparator轉(zhuǎn)化為排序器 |
操作方法:
reverse(): 返回與當(dāng)前Ordering相反的排序:
nullsFirst(): 返回一個(gè)將null放在non-null元素之前的Ordering囊扳,其他的和原始的Ordering一樣;
nullsLast():返回一個(gè)將null放在non-null元素之后的Ordering兜看,其他的和原始的Ordering一樣锥咸;
compound(Comparator):返回一個(gè)使用Comparator的Ordering,Comparator作為第二排序元素细移,例如對(duì)bug列表進(jìn)行排序搏予,先根據(jù)bug的級(jí)別,再根據(jù)優(yōu)先級(jí)進(jìn)行排序弧轧;
lexicographical():返回一個(gè)按照字典元素迭代的Ordering雪侥;
onResultOf(Function):將function應(yīng)用在各個(gè)元素上之后, 在使用原始o(jì)rdering進(jìn)行排序;
greatestOf(Iterable iterable, int k):返回指定的第k個(gè)可迭代的最大的元素劣针,按照這個(gè)從最大到最小的順序校镐。是不穩(wěn)定的。
leastOf(Iterable<E> iterable,int k):返回指定的第k個(gè)可迭代的最小的元素捺典,按照這個(gè)從最小到最大的順序鸟廓。是不穩(wěn)定的。
isOrdered(Iterable):是否有序襟己,Iterable不能少于2個(gè)元素引谜。
isStrictlyOrdered(Iterable):是否嚴(yán)格有序。請(qǐng)注意擎浴,Iterable不能少于兩個(gè)元素员咽。
sortedCopy(Iterable):返回指定的元素作為一個(gè)列表的排序副本。