国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Java集合排序規(guī)則接口Comparator用法解析

瀏覽:8日期:2022-08-24 16:42:56

1. 前言

最近用到了集合排序(基于 Java 8)。現在我能用 Stream 的就用 Stream ,真香!排序可以這么寫:

List<People> peoples = new ArrayList<>();// 中間省略// 按照年齡從小到大排序peoples.sort(Comparator.comparing(People::getAge));

這里排序用到了一個關鍵接口 java.util.Comparator。排序比較作為業(yè)務中經常出現的需求,我們有必要研究一下這個接口。

2. Comparator 概念

Comparator 是一個函數式接口。它經常用于沒有天然排序的集合進行排序,如 Collections.sort 或 Arrays.sort或者對于某些有序數據結構的排序規(guī)則進行聲明,如 TreeSet 、TreeMap 。也就是該接口主要用來進行集合排序。

3. Comparator 中的方法

Comparator 作為一個函數式接口只有一個抽象方法,但是它有很多的默認方法,我們來認識一下這些方法們。

3.1 compare 抽象方法

作為Comparator 唯一的抽象方法,int compare(T o1,T o2) 比較兩個參數的大小, 返回負整數,零,正整數 ,分別代表 o1&lt;o2、o1=o2、o1&gt;o2,通常分別返回 -1、0 或 1。偽表達式:

// 輸入兩個同類型的對象 ,輸出一個比較結果的int數字(x1,x2)-> int

實現該方法一定要注意以下事項:

必須保證compare(x,y) 和compare(y,x) 的值的和必須為 0 。 必須保證比較的順序關系是可傳遞的,如果compare(x,y)&gt;0 而且compare(y,z)&gt;0 則 compare(x,z)&gt;0。 如果存在 compare(x,y)=0,則對于 z 而言,存在 compare(x, z)==compare(y, z)。

然而并不 嚴格要求(compare(x, y)==0) == (x.equals(y))。一般說來,任何違背這個條件的 Comparator 實現都應該明確指出這一事實情況。

3.2 comparing 系列方法

從 Java 8 開始,Comparator 提供了一系列的靜態(tài)方法,并通過函數式的風格賦予 Comparator 更加強大和方便的功能,我們暫且稱它們?yōu)?comparing系列方法。

public static <T, U> Comparator<T> comparing( Function<? super T, ? extends U> keyExtractor, Comparator<? super U> keyComparator) { Objects.requireNonNull(keyExtractor); Objects.requireNonNull(keyComparator); return (Comparator<T> & Serializable) (c1, c2) -> keyComparator.compare(keyExtractor.apply(c1), keyExtractor.apply(c2)); }

該方法是該系列方法的基本方法。是不是看上去很難懂的樣子?我們來分析一下該方法。它一共兩個參數都是函數式接口。

第一個參數 Function&lt;? super T, ? extends U&gt; keyExtractor 表示輸入一個是 T 類型對象,輸出一個 U 類型的對象,舉個例子,輸入一個 People 對象返回其年齡 Integer 數值:

// people -> people.getAge(); 轉換為下面方法引用Function<People, Integer> getAge = People::getAge;

第二個參數 keyComparator就很好理解了,表示使用的比較規(guī)則。

對 c1,c2 按照 第一個參數 keyExtractor 提供的規(guī)則進行提取特征,然后第二個參數keyComparator對這兩個特征進行比較。下面的式子其實可以概括為 3.1 的 (x1,x2)-&gt; int

(c1, c2) -> keyComparator.compare(keyExtractor.apply(c1),keyExtractor.apply(c2))

Comparator& Serializable 為 Java 8 新特性:同時滿足這兩個類型約束

理解了這個方法后,其它該系列的方法就好理解了,這里不再贅述。目前 comparing 系列方法使用更加廣泛。我們舉一些例子:

List<People> peoples = new ArrayList<>();// ………………// 按照年齡從低到高排序peoples.sort(Comparator.comparing(People::getAge));// 按照年齡從高到低排序peoples.sort(Comparator.comparing(People::getAge, (x, y) -> -x.compareTo(y)));

同樣你可以使用 java.util.Collections 或者 Stream 提供的排序方法來使用Comparator。

4. 小結

今天對 Comparator進行了簡單的分析,它用于構建集合排序的規(guī)則,在日常開發(fā)中非常有用。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 日韩毛片欧美一级a网站 | 久久综合久美利坚合众国 | 九九视频免费在线观看 | 国产欧美日韩视频免费61794 | 国产精品久久久久久久9999 | 97在线观看完整免费 | 国产色视频在线观看免费 | 亚洲成人高清 | 国产精品久久久久久久9999 | 中文字幕乱码视频32 | 在线观看人成网站深夜免费 | 自拍偷拍欧美视频 | 日本精品视频一视频高清 | 久草3| 免费观看日本高清a毛片 | 日本韩国一级毛片中文字幕 | 美女被免费网站在线视频软件 | 亚洲国产精品久久久久久 | 欧美中日韩在线 | 亚洲成人在线免费 | pgone太大了兽王免费视频 | 国产精品亚洲视频 | 久久这里只有精品视频99 | 国产精品莉莉欧美自在线线 | 国产欧美日韩不卡在线播放在线 | 日本亚洲欧美高清专区vr专区 | 国产真实孩交 | 国产免费高清福利拍拍拍 | 韩国三级大全久久网站 | 国产精品亚洲片在线va | 成人免费视频软件网站 | 久草网视频 | 日本精品久久久久久久久免费 | 欧美在线a级高清 | 在线欧美日韩精品一区二区 | 日本特爽特黄特刺激大片 | 欧美成国产精品 | 一级成人a做片免费 | 激情丝袜美女视频二区 | 一本久久道 | 国产成人午夜极速观看 |