欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1. 前言

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

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

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

2. Comparator 概念

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

3. Comparator 中的方法

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

3.1 compare 抽象方法

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

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

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

  • 必須保證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,則對于 z 而言,存在 compare(x, z)==compare(y, z)。

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

3.2 comparing 系列方法

從 Java 8 開始,Comparator 提供了一系列的靜態(tài)方法,并通過函數(shù)式的風(fēng)格賦予 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));
  }

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

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

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

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

對 c1,c2 按照 第一個參數(shù) keyExtractor 提供的規(guī)則進行提取特征,然后第二個參數(shù)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. 小結(jié)

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

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

相關(guān)文章

  • 關(guān)于@DS注解切換數(shù)據(jù)源失敗的原因?qū)崙?zhàn)記錄

    關(guān)于@DS注解切換數(shù)據(jù)源失敗的原因?qū)崙?zhàn)記錄

    項目配置了多個數(shù)據(jù)源,需要使用@DS注解來切換數(shù)據(jù)源,但是卻遇到了問題,下面這篇文章主要給大家介紹了關(guān)于@DS注解切換數(shù)據(jù)源失敗原因的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • IDEA啟動Tomcat報Unrecognized option: --add-opens=java.base/java.lang=ALL-UNNAMED的解決方法

    IDEA啟動Tomcat報Unrecognized option: --add-opens=java

    這篇文章主要為大家介紹了解決IDEA啟動Tomcat報Unrecognized option: --add-opens=java.base/java.lang=ALL-UNNAMED的方法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • 淺談自定義校驗注解ConstraintValidator

    淺談自定義校驗注解ConstraintValidator

    鑒于通用性和普遍性,Spring框架提供了validator組件,通過一些校驗器,可以對一些數(shù)據(jù)進行統(tǒng)一的完整性和有效性等校驗,即簡單又好用
    2021-06-06
  • Java 如何使用Velocity引擎生成代碼

    Java 如何使用Velocity引擎生成代碼

    代碼生成器,可以有效減少編寫重復(fù)代碼,快速實現(xiàn)簡單的業(yè)務(wù)邏輯,也能讓我們的代碼保持一致。那目前,我們看到的代碼生成器,大部分是基于velocity引擎模板生成的,接下來我們就學(xué)習(xí)一下如何實現(xiàn)代碼生成器。
    2021-06-06
  • java使用EasyExcel實現(xiàn)Sheet的復(fù)制與填充

    java使用EasyExcel實現(xiàn)Sheet的復(fù)制與填充

    EasyExcel是一個非常有用的工具,它提供了強大的模板填充功能,可以輕松解決各種業(yè)務(wù)需求,本文主要為大家介紹了如何使用EasyExcel實現(xiàn)模板Sheet復(fù)制與填充,需要的可以參考下
    2023-10-10
  • Java方法調(diào)用解析靜態(tài)分派動態(tài)分派執(zhí)行過程

    Java方法調(diào)用解析靜態(tài)分派動態(tài)分派執(zhí)行過程

    這篇文章主要為大家介紹了Java方法調(diào)用解析靜態(tài)分派動態(tài)分派執(zhí)行過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • java線程本地變量ThreadLocal詳解

    java線程本地變量ThreadLocal詳解

    ThreadLocal則為每一個線程提供了一個變量副本,從而隔離了多個線程訪問數(shù)據(jù)的沖突,ThreadLocal提供了線程安全的對象封裝,下面我們就來詳細了解一下吧
    2019-06-06
  • hadoop?全面解讀自定義分區(qū)

    hadoop?全面解讀自定義分區(qū)

    Hadoop是一個由Apache基金會所開發(fā)的分布式系統(tǒng)基礎(chǔ)架構(gòu)。用戶可以在不了解分布式底層細節(jié)的情況下,開發(fā)分布式程序。充分利用集群的威力進行高速運算和存儲
    2022-02-02
  • Java設(shè)計模式之依賴倒轉(zhuǎn)原則精解

    Java設(shè)計模式之依賴倒轉(zhuǎn)原則精解

    設(shè)計模式(Design pattern)代表了最佳的實踐,通常被有經(jīng)驗的面向?qū)ο蟮能浖_發(fā)人員所采用。設(shè)計模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。本篇介紹設(shè)計模式七大原則之一的依賴倒轉(zhuǎn)原則
    2022-02-02
  • idea如何通過maven指定JDK版本

    idea如何通過maven指定JDK版本

    這篇文章主要介紹了idea如何通過maven指定JDK版本問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評論