午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

1. 前言

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

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

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

2. Comparator 概念

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

3. Comparator 中的方法

Comparator 作為一個(gè)函數(shù)式接口只有一個(gè)抽象方法,但是它有很多的默認(rèn)方法,我們來認(rèn)識(shí)一下這些方法們。

3.1 compare 抽象方法

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

// 輸入兩個(gè)同類型的對(duì)象 ,輸出一個(gè)比較結(jié)果的int數(shù)字(x1,x2)-> int

實(shí)現(xiàn)該方法一定要注意以下事項(xiàng):

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

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

3.2 comparing 系列方法

從 Java 8 開始,Comparator 提供了一系列的靜態(tài)方法,并通過函數(shù)式的風(fēng)格賦予 Comparator 更加強(qiáng)大和方便的功能,我們暫且稱它們?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)); }

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

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

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

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

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

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

Comparator& Serializable 為 Java 8 新特性:同時(shí)滿足這兩個(gè)類型約束

理解了這個(gè)方法后,其它該系列的方法就好理解了,這里不再贅述。目前 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. 小結(jié)

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 欧美成人激情 | 九月色婷婷| 亚洲理伦| 日韩中文字幕在线免费观看 | 在线成人免费观看 | 国产日产亚洲系列最新 | 亚洲区av| 日本不卡视频一区二区 | 亚洲成a人片在线www | 欧美一级片网址 | 国产亚洲片 | 欧美成人一区二区三区片免费 | 激情伊人 | 亚洲午夜18毛片在线看 | 97超碰免费观看 | 中文一区二区在线观看 | 高跟鞋肉丝交足91 | 日本免费色| www夜夜操 | 日韩www视频 | 久久香蕉国产 | 少妇性l交大片7724com | 一二三在线视频 | 欧美一区日韩一区 | 黄色免费网站大全 | 91午夜影院 | 国产精品久久久久久久9999 | 三年中国中文在线观看免费播放 | 亚洲天堂毛片 | 超碰在线公开免费 | 精品一区二区三区毛片 | 免费网站91 | 神马午夜影院 | 天天操网站 | 国精产品99永久一区一区 | 高清一区二区 | aaaa一级片| 精品中文字幕在线观看 | 国产在线不卡av | 福利在线看 | 国产视频手机在线 |