1. 程式人生 > >Guava鏈式風格Ordering比較器例項

Guava鏈式風格Ordering比較器例項

1.簡介

Ordering 例項無非就是一個特殊的Comparator 例項。Ordering只是需要依賴於一個比較器(例如,Collections.max)的方法,並使其可作為例項方法。另外,Ordering提供了鏈式方法呼叫和加強現有的比較器,可以輕鬆構造複雜的comparator。

2.例項

場景是對一個list中的元素按照一定規則排序,首先我們新建一個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進行排序,一般情況下有兩種方式,一種就是迴圈 list並按照規則將TestOrder插入新的list;另一種方式是實現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比較器結束 *****************************/ 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):返回指定的元素作為一個列表的排序副本。

相關推薦

Guava風格Ordering比較例項

1.簡介 Ordering 例項無非就是一個特殊的Comparator 例項。Ordering只是需要依賴於一個比較器(例如,Collections.max)的方法,並使其可作為例項方法。另外,Ordering提供了鏈式方法呼叫和加強現有的比較器,可以輕鬆構造

GuavaOrdering比較

簡介 Ordering是Guava類庫提供的一個犀利強大的比較器工具,Guava的Ordering和JDK Comparator相比功能更強。它非常容易擴充套件,可以輕鬆構造複雜的comparator,然後用在容器的比較、排序等操作中。 本質上來說,Order

Java-類庫-Guava-Ordering比較

 Ordering是Guava類庫提供的一個犀利強大的比較器工具,Guava的Ordering和JDK Comparator相比功能更強。它非常容易擴充套件,可以輕鬆構造複雜的comparator,然後用在容器的比較、排序等操作中。   本質上來說,Order

存圖方法之前向星+BFS例項精講

存圖方法有很多,最暴力的方法就是開一個二維陣列 int maze[1000][1000]; //最多能大概5000 5000 int a, b, c; // 一條從a到b的權值為c的邊 while( cin >> a >> b >>

PipeStyle PHP風格

靈感來自使用linux時的 |xargs ,將巢狀函式改為鏈式風格,意義嘛 來看個例子 $result = abs(round(pow(sin(123),3),1)); 》》 0.1 這個是簡單的 ,只有四層括號 ,如果需求改了下 四捨五入從保留1位改為保留2位 - - 是

做一個不復制貼上的程式設計師[1]: 使用模板方法模式(2)- 物件更新比較例項

在進入正題之前,說一些廢話,談談對於我的前一篇文章被移出部落格園首頁的想法。不談我對於其他首頁文章的看法,光從我自身找找原因。下面分析下可能的原因: 篇幅太短:我覺得篇幅不能決定文章的質量,要說清楚一個問題,肯定字數越少越好 程式碼過多,文字太少:Talk is cheap. Show me the cod

(資料科學學習手札107)在Python中利用funct實現風格程式設計

> 本文示例程式碼已上傳至我的`Github`倉庫[https://github.com/CNFeffery/DataScienceStudyNotes](https://github.com/CNFeffery/DataScienceStudyNotes) # 1 簡介   鏈式程式設計是一種非常高效的

[Google Guava] 1-4 排序: Guava強大的”流暢風格比較

判斷 cal java width reverse right col tor res 原文鏈接 譯者: 沈義揚 排序器[Ordering]是Guava流暢風格比較器[Comparator]的實現,它可以用來為構建復雜的比較器,以完成集合排序的功能。 從實現上說,Orde

[Google Guava] 排序: Guava強大的”流暢風格比較

原文連結 譯者: 沈義揚 排序器[Ordering]是Guava流暢風格比較器[Comparator]的實現,它可以用來為構建複雜的比較器,以完成集合排序的功能。 從實現上說,Ordering例項就是一個特殊的Comparator例項。Ordering把很多基於Comparator的靜態方法(

Guava學習筆記:Ordering犀利的比較

  Ordering是Guava類庫提供的一個犀利強大的比較器工具,Guava的Ordering和JDK Comparator相比功能更強。它非常容易擴充套件,可以輕鬆構造複雜的comparator,然後用在容器的比較、排序等操作中。   本質上來說,Ordering 例項無非就是一個特殊的Comparat

Google Guava 工具集__3__ Ordering犀利的比較 Object方法

Ordering是Guava類庫提供的一個犀利強大的比較器工具,Guava的Ordering和JDK Comparator相比功能更強。它非常容易擴充套件,可以輕鬆構造複雜的comparator,然後用在容器的比較、排序等操作中。   本質上來說,Orderin

js代碼風格結構

div remove show js代碼 next() 縮進 child 結構 rip <div class="box">   <ul class="menu">     <li class="level1">       &

jQuery選擇方法-導航

長袖t恤 功能 log back color menu set alt ack 利用vs新建一個空白web項目, 再用nuget安裝jQuery 1.x最新版,目前是 jQuery 1.12.4 新建一個html頁面 再將jquery.js拖進新建的頁面的頭部

jQuery支持編程,一句話實現左側table頁+常用篩選總結

charset tle har http children ID prev lin next() <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8">

順序儲存結構與儲存結構的比較(也可以說的順序表與連結串列的比較

1、鏈式儲存結構的儲存空間在邏輯上是連續的,但是在物理上是離散的;而順序儲存結構的儲存空間在邏輯上是連續的,在物理上也是連續的。 2、鏈式儲存儲存密度小,但空間利用率較高;順序儲存儲存密度大,但空間利用率較低。 3、順序結構優點是可以隨機讀取元素,缺點是插入和刪除元素要移動大量元素,

PHP實現的連貫操作、操作例項

PHP中的連貫操作看起來的確很酷,也非常的方便程式碼的閱讀,當然了必須是在OOP中用才行,在過程化的程式中,就沒有必要用這種方法了。有實現這個方法的有用_CALL來實現的,下面的這個例子,則不是用_call的 /* * SQL語句組合例項類,始發文章web開發筆記 * 學習用,非專業

scalar中的基於Ordered和Ordering兩種比較

1>Ordered class PP(var name: String, var age: Int) extends Ordered[PP] { override def compare(that: PP) = if (this.age > that.age) -1 else if (

Ordering犀利的比較

Ordering是Guava類庫提供的一個犀利強大的比較器工具,Guava的Ordering和JDK Comparator相比功能更強。它非常容易擴充套件,可以輕鬆構造複雜的comparator,然後用在容器的比較、排序等操作中。 本質上來說,Ordering 例項無非就是一個特殊的Co

Guava 系列 - 比較

文章目錄 Guava 系列 - 比較器 1、自我實現的比較器例子 2、使用guava比較器 Guava 系列 - 比較器