最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年09月15日 09:18:54   作者:碼農(nóng)小胖哥  
這篇文章主要介紹了Java集合排序規(guī)則接口Comparator用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

1. 前言

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

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)常用于沒(méi)有天然排序的集合進(jìn)行排序,如 Collections.sort 或 Arrays.sort或者對(duì)于某些有序數(shù)據(jù)結(jié)構(gòu)的排序規(guī)則進(jìn)行聲明,如 TreeSet 、TreeMap 。也就是該接口主要用來(lái)進(jìn)行集合排序。

3. Comparator 中的方法

Comparator 作為一個(gè)函數(shù)式接口只有一個(gè)抽象方法,但是它有很多的默認(rèn)方法,我們來(lái)認(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))。一般說(shuō)來(lái),任何違背這個(gè)條件的 Comparator 實(shí)現(xiàn)都應(yīng)該明確指出這一事實(shí)情況。

3.2 comparing 系列方法

從 Java 8 開(kāi)始,Comparator 提供了一系列的靜態(tài)方法,并通過(guò)函數(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));
  }

該方法是該系列方法的基本方法。是不是看上去很難懂的樣子?我們來(lái)分析一下該方法。它一共兩個(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 提供的排序方法來(lái)使用Comparator。

4. 小結(jié)

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

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

相關(guān)文章

  • java向多線程中傳遞參數(shù)的三種方法詳細(xì)介紹

    java向多線程中傳遞參數(shù)的三種方法詳細(xì)介紹

    但在多線程的異步開(kāi)發(fā)模式下,數(shù)據(jù)的傳遞和返回和同步開(kāi)發(fā)模式有很大的區(qū)別。由于線程的運(yùn)行和結(jié)束是不可預(yù)料的,因此,在傳遞和返回?cái)?shù)據(jù)時(shí)就無(wú)法象函數(shù)一樣通過(guò)函數(shù)參數(shù)和return語(yǔ)句來(lái)返回?cái)?shù)據(jù)
    2012-11-11
  • 一文帶你全面了解Java?Hashtable

    一文帶你全面了解Java?Hashtable

    HashTable是jdk?1.0中引入的產(chǎn)物,基本上現(xiàn)在很少使用了,但是會(huì)在面試中經(jīng)常被問(wèn)到。本文就來(lái)帶大家一起深入了解一下Hashtable,需要的可以參考一下
    2022-09-09
  • 在java中 利用匿名內(nèi)部類進(jìn)行較簡(jiǎn)潔的雙括弧初始化的方法

    在java中 利用匿名內(nèi)部類進(jìn)行較簡(jiǎn)潔的雙括弧初始化的方法

    本篇文章小編將為大家介紹,關(guān)于在java中 利用匿名內(nèi)部類進(jìn)行較簡(jiǎn)潔的雙括弧初始化的方法,有需要的朋友可以參考一下
    2013-04-04
  • java 如何讀取properties文件

    java 如何讀取properties文件

    這篇文章主要介紹了java 如何讀取properties文件,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • 使用Mybatis-plus清空表數(shù)據(jù)的操作方法

    使用Mybatis-plus清空表數(shù)據(jù)的操作方法

    MyBatis 是一個(gè)基于 java 的持久層框架,它內(nèi)部封裝了 jdbc,極大提高了我們的開(kāi)發(fā)效率,文中給大家介紹了MybatisPlus常用API-增刪改查功能,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • springboot 整合EhCache實(shí)現(xiàn)單服務(wù)緩存的操作方法

    springboot 整合EhCache實(shí)現(xiàn)單服務(wù)緩存的操作方法

    這篇文章主要介紹了springboot 整合EhCache實(shí)現(xiàn)單服務(wù)緩存的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • JAVA  靜態(tài)的單例的實(shí)例詳解

    JAVA 靜態(tài)的單例的實(shí)例詳解

    這篇文章主要介紹了JAVA 靜態(tài)的單例的實(shí)例詳解的相關(guān)資料,這里提供了實(shí)例方法,來(lái)說(shuō)名不僅實(shí)現(xiàn)了延遲加載,又可以保證線程安全,不影響系統(tǒng)性能,需要的朋友可以參考下
    2017-07-07
  • IDEA2019.3配置Hibernate的詳細(xì)教程(未使用IDEA的自動(dòng)化)

    IDEA2019.3配置Hibernate的詳細(xì)教程(未使用IDEA的自動(dòng)化)

    這篇文章主要介紹了IDEA2019.3配置Hibernate的詳細(xì)教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 詳細(xì)全面解析Java泛型

    詳細(xì)全面解析Java泛型

    這篇文章主要介紹了詳細(xì)全面解析Java泛型,java泛型主要提高了Java 程序的類型安全,通過(guò)知道使用泛型定義的變量的類型限制,編譯器可以驗(yàn)證類型假設(shè),消除源代碼中的許多強(qiáng)制類型轉(zhuǎn)換等多個(gè)有點(diǎn),下面我們進(jìn)入文章了解更多的詳細(xì)內(nèi)容吧
    2022-02-02
  • Java實(shí)現(xiàn)批量下載(打包成zip)的實(shí)現(xiàn)

    Java實(shí)現(xiàn)批量下載(打包成zip)的實(shí)現(xiàn)

    這篇文章主要介紹了Java實(shí)現(xiàn)批量下載(打包成zip)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評(píng)論

岳阳市| 黄龙县| 闽清县| 澎湖县| 资中县| 邯郸市| 莆田市| 双柏县| 普安县| 莎车县| 呼伦贝尔市| 青冈县| 东山县| 乌兰察布市| 威海市| 临潭县| 灵川县| 广平县| 逊克县| 昆明市| 阜阳市| 百色市| 崇阳县| 昌平区| 泰和县| 南召县| 安塞县| 恭城| 施甸县| 拉孜县| 碌曲县| 平顶山市| 城口县| 蓬安县| 岳阳市| 松原市| 开远市| 屯留县| 宜州市| 泰顺县| 清涧县|