Guava鏈?zhǔn)斤L(fēng)格Ordering比較器實(shí)例

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

  1. 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è)列表的排序副本。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贮预,一起剝皮案震驚了整個(gè)濱河市贝室,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仿吞,老刑警劉巖滑频,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異唤冈,居然都是意外死亡峡迷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绘搞,“玉大人彤避,你說(shuō)我怎么就攤上這事『幌剑” “怎么了琉预?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)楼雹。 經(jīng)常有香客問我模孩,道長(zhǎng),這世上最難降的妖魔是什么贮缅? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮介却,結(jié)果婚禮上谴供,老公的妹妹穿的比我還像新娘。我一直安慰自己齿坷,他們只是感情好桂肌,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著永淌,像睡著了一般崎场。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遂蛀,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天谭跨,我揣著相機(jī)與錄音,去河邊找鬼李滴。 笑死螃宙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的所坯。 我是一名探鬼主播谆扎,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芹助!你這毒婦竟也來(lái)了堂湖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤状土,失蹤者是張志新(化名)和其女友劉穎无蜂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體声诸,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酱讶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彼乌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泻肯。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渊迁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出灶挟,到底是詐尸還是另有隱情琉朽,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布稚铣,位于F島的核電站箱叁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏惕医。R本人自食惡果不足惜耕漱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抬伺。 院中可真熱鬧螟够,春花似錦、人聲如沸峡钓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)能岩。三九已至寞宫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拉鹃,已是汗流浹背辈赋。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毛俏,地道東北人炭庙。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像煌寇,于是被迫代替她去往敵國(guó)和親焕蹄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 對(duì)于集合來(lái)說(shuō)阀溶,排序是一個(gè)很常見的操作腻脏,Java已經(jīng)提供了一系列排序的方法,如Collections中的靜態(tài)方法...
    ChimeEmail團(tuán)隊(duì)閱讀 1,859評(píng)論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法银锻,類相關(guān)的語(yǔ)法永品,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法击纬,異常的語(yǔ)法鼎姐,線程的語(yǔ)...
    子非魚_t_閱讀 31,665評(píng)論 18 399
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少炕桨,但最終還是拿到小米饭尝、百度、阿里献宫、京東钥平、新浪、CVTE姊途、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,278評(píng)論 11 349
  • There are two sorted arrays nums1 and nums2 of size m...
    Shiyi001閱讀 226評(píng)論 0 1
  • 物聯(lián)網(wǎng)大勢(shì)所趨涉瘾,智能家居設(shè)備越來(lái)越多,電商和家電廠商均致力于打造一個(gè)智能化的控制中心捷兰,連接這些設(shè)備立叛,使其運(yùn)...
    snowfish0214閱讀 206評(píng)論 0 1