Java8 Comparator接口 和 List Steam 排序使用案例

在Java中,Comparator接口主要用于實現自定義排序邏輯,適用于未實現Comparable接口或需要覆蓋默認比較規則的場景。以下是核心使用方法和注意事項:

一、基礎用法

  1. ?匿名內部類實現?
    傳統方式通過匿名內部類重寫compare()方法,例如對整數降序排序:

    List<Integer> list = Arrays.asList(3, 1, 2); 
    list.sort(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) {// 降序 return o2 - o1; } } );

    此方式在Java 8之前常見。

  2. ?Lambda表達式簡化?
    Java 8后可用Lambda替代匿名類,代碼更簡潔:

    list.sort((o1, o2) -> o2 - o1);

    或使用方法引用:

    list.sort(Comparator.reverseOrder());

    適用于簡單排序場景。

二、高級特性

  1. ?多條件排序?
    使用thenComparing()實現多級排序,例如先按年齡升序,再按姓名降序:

    List<Person> people = ...; 
    people.sort( Comparator.comparing(Person::getAge) .thenComparing(Comparator.comparing(Person::getName).reversed() ) );

    支持鏈式調用,靈活組合排序規則。

  2. ?處理null值?
    需顯式處理null避免NullPointerException,例如將null排在末尾:

    list.sort((a, b) -> {if (a == null) return 1;if (b == null) return -1; return a.compareTo(b);});

    注意違反自反性會導致Comparison method violates its general contract錯誤。

三、Comparator與Comparable對比

?維度??Comparator??Comparable?
實現位置獨立類或匿名類目標類內部實現
排序規則支持多種自定義規則僅提供單一自然排序
侵入性無侵入,不影響原有類需修改類結構
典型應用場景第三方類排序、多規則排序類自身有明確排序邏輯(如String)

優先使用Comparator實現靈活排序,尤其是需要動態調整規則時。

四、常見問題

  1. ?整數溢出風險?
    避免直接返回o1 - o2,應使用
    Integer.compare(o1, o2)。
  2. ?JDK8增強方法?
    • Comparator.naturalOrder():自然排序
    • Comparator.nullsFirst():將null置于開頭
    • Comparator.comparingInt():避免裝箱開銷68。

通過合理應用Comparator,可高效實現復雜排序需求,同時保持代碼可維護性。

Java 8的?Stream API?提供了強大的List排序功能,主要通過sorted()方法實現,支持自然排序、自定義排序以及多條件組合排序。以下是核心用法總結:

1. 基礎排序

  • ?自然排序(升序)?:直接調用sorted()方法,元素需實現Comparable接口
    list.stream().sorted().collect(Collectors.toList()); 
  • ?降序排序?:通過Comparator.reverseOrder()reversed()方法
    list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());// 或 
    list.stream().sorted(Comparator.comparing(Person::getAge).reversed()).collect(Collectors.toList());

2. 自定義排序

  • ?單字段排序?:使用Comparator.comparing()指定字段
    list.stream().sorted(Comparator.comparing(Student::getScore)).collect(Collectors.toList());
  • ?多字段排序?:通過thenComparing()鏈式調用
    list.stream() .sorted(Comparator.comparing(Student::getAge)   .thenComparing(Student::getName)) .collect(Collectors.toList());

3. 空值處理

  • ?空值優先/后置?:使用Comparator.nullsFirst()Comparator.nullsLast()
    list.stream() .sorted(Comparator.comparing(Student::getAge,           Comparator.nullsFirst(Integer::compareTo))) .collect(Collectors.toList());

4. 性能提示

  • sorted()操作對大型流可能較昂貴,若數據已排序可跳過此操作2
  • 復雜排序建議預編譯Comparator以減少重復計算9

完整示例:

List<Student> students = Arrays.asList( new Student("Alice", 25), new Student("Bob", 20) );List<Student> sorted = students.stream() .sorted(Comparator.comparing(Student::getAge).reversed()) .collect(Collectors.toList());

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96083.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96083.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96083.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

word2vec模型案例

代碼實現&#xff1a;import torch.optim as optim from tqdm import tqdm, trange import numpy as np import torch from torch import nn import torch.nn.functional as FCONTEXT_SIZE 2raw_text """We are about to study the idea of a computational p…

< 自用文 OS 有關 > (續)發現正在被攻擊 后的自救 Fail2ban + IPset + UFW 工作流程詳解

繼上編&#xff1a;&#xff1c; 自用文 主機 USC 記錄&#xff1a;&#xff1e; 發現正在被攻擊 后的自救-CSDN博客 環境&#xff1a; 改進&#xff1a; 以下是把代碼&#xff0c;懶得寫&#xff0c;扔給了 AI &#xff0c;讓它出的&#xff1a; Fail2ban IPset UFW 工作…

Linux —— 虛擬進程地址空間

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄虛…

簡單聊一聊js

JavaScript 是一種高級的、解釋型的編程語言。它是現代 Web 開發的三大核心基石之一&#xff0c;與 HTML 和 CSS 并列。?HTML?&#xff1a;負責網頁的結構和內容?&#xff08;如標題、段落、圖片&#xff09;。?CSS?&#xff1a;負責網頁的樣式和布局?&#xff08;如顏色…

造粒機cad+設計說明書

摘要 隨著現代化工業的快速發展&#xff0c;生產出大量的固體廢棄物。這些廢棄物對環境造成了很大的污染&#xff0c;因此需要采取有效的措施進行處理。機械強壓式造粒機就是一種非常有效的處理工具&#xff0c;它可以將廢渣、廢料、飼料和化肥等材料通過機械強力擠壓&#xff…

第五課 C#語言基本元素概覽,初始類型,變量與方法,算法簡介

熟悉C#語言要求&#xff1a;對構成C#語言的基本元素&#xff0c;隨便拿出一個你都認識&#xff0c;對于常見基本元素&#xff0c;都能正確使用它 精通C#語言要求&#xff1a;對于構成C#語言的基本元素&#xff0c;隨便拿出一個都會使用&#xff0c;對于常用基本元素&#xff0…

LLM學習:大模型基礎——視覺大模型以及autodl使用

1、常見的VLM 在大模型中,VLM 是視覺語言模型(Vision-Language Model)的縮寫,是一種多模態、生成式 AI 模型,能夠理解和處理視頻、圖像和文本。 VLM 通過將大語言模型(LLM)與視覺編碼器相結合構建而成,使 LLM 具有 “看” 的能力,從而可以處理并提供對提示中的…

Vue—路由配置中設置了meta.title,但頁面標題仍然顯示為“Vite App“?【讓我來看看~】

路由配置中明明設置了meta.title&#xff0c;但是頁面標題仍然顯示為"Vite App"&#xff1f;這是因為僅僅在路由配置中設置meta.title是不夠的&#xff0c;還需要在路由守衛中動態設置頁面標題。需要做以下幾件事來正確設置頁面標題&#xff1a;1.首先更新HTML文件的…

【機器學習】綜合實訓(二)

項目五 電影評分預測【教學內容】使用 MovieLens 數據集&#xff0c;訓練一個模型預測用戶對電影的評分。主要有以下幾個知識點&#xff1a;&#xff08;1&#xff09;數據加載與探索性分析&#xff08;EDA&#xff09;。&#xff08;2&#xff09;處理稀疏數據&#xff08;如用…

STM32 UART + DMA + 空閑中斷使用中的幀錯誤(FE)問題及解決方案

STM32 UART + DMA + IDLE中斷使用中的幀錯誤(FE)問題及解決方案 在我調試STM32H7串口空閑中斷DMA接受時遇到了一個bug,這個現象發生在系統剛上電時,有個串口由于幀錯誤FE掛起了中斷,之后在HAL_UART_IRQHandler這個全局中斷處理函數結束后,所有的中斷使能標志位都被清除了,經過…

TDengine 選擇函數 BOTTOM() 用戶手冊

BOTTOM() 函數用戶手冊 函數定義 BOTTOM(expr, k)功能說明 BOTTOM() 函數統計表/超級表中某列的值最小 k 個非 NULL 值。如果多條數據取值一樣&#xff0c;全部取用又會超出 k 條限制時&#xff0c;系統會從相同值中隨機選取符合要求的數量返回。 返回值 數據類型: 同應用…

西門子 S7-200 SMART PLC 實現星三角降壓啟動控制:原理、案例與完整程序

在工業控制場景中&#xff0c;中型異步電機直接啟動時會產生遠超額定電流的沖擊電流&#xff08;通常為額定電流的 5-7 倍&#xff09;&#xff0c;不僅會影響電網穩定性&#xff0c;還可能對機械設備造成損傷。星三角&#xff08;Y-Δ&#xff09;降壓啟動是解決這一問題的經典…

【Android】View 的基礎知識

【Android】View 的基礎知識 1. 什么是 View&#xff1f; View 是 Android 中所有UI組件的基礎類。它表示屏幕上的一個矩形區域&#xff0c;負責繪制內容和處理用戶交互事件。所有的 UI 組件&#xff08;如按鈕、文本框等&#xff09;都是 View 的子類&#xff0c;而 ViewGroup…

西門子 S7-200 SMART PLC 實現電機點動與連續運行綜合控制

在工業生產中&#xff0c;電機控制并非單一模式&#xff1a;調試設備時需要 “按動即轉、松開即停” 的點動功能&#xff0c;正常生產時則需要 “一鍵啟動、持續運行” 的連續控制。本文以西門子 S7-200 SMART PLC 為載體&#xff0c;詳細講解電機點動控制原理&#xff0c;并設…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘sphinx-rtd-theme’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘sphinx-rtd-theme’問題 摘要 在使用 PyCharm 開發 Python 項目時&#xff0c;pip install 報錯是常見痛點。特別是在構建文檔或引入第三方庫時&#xff0c;開…

HakcMyVM-Literal

目錄信息搜集漏洞利用權限提升信息搜集 主機發現 ┌──(kali?kali)-[~] └─$ nmap -sn 192.168.21.0/24 Nmap scan report for 192.168.21.5端口掃描 ┌──(kali?kali)-[~] └─$ nmap -sS -sV -O -p- 192.168.21.5 Starting Nmap 7.95 ( https://nmap.org ) a…

0904 類的繼承

Part 1.梳理思維導圖一.繼承中的特殊成員函數1.構造函數父類的構造函數會被繼承到子類中&#xff0c;在構造的順序中&#xff0c;是先構造父類&#xff0c;再構造子類#include <iostream>using namespace std;class Father { public:string name; protected:int *age; pr…

PDF教程|如何把想要的網頁保存下來?

前段時間有個小伙伴咨詢了小白&#xff1a;領導想要某個網頁的整個頁面&#xff0c;有沒有比較好的方法把它保存下來&#xff1f; 在他找到小白之前&#xff0c;這種事情他已經接到好幾次了&#xff0c;每次都是怎么解決的呢&#xff1f;其實很簡單&#xff0c;就是打開Word&a…

【bash】命令查看當前目錄下文件個數

要用 ls 查看當前目錄下的文件個數&#xff0c;可以結合 wc -l 來統計行數&#xff1a; ls -1 | wc -l說明&#xff1a; ls -1&#xff1a;以一行一個文件的方式列出。wc -l&#xff1a;統計行數&#xff0c;也就是文件/目錄的數量。 ?? 需要注意&#xff1a; 這個方法會把文…

「日拱一碼」081 機器學習——梯度增強特征選擇GBFS

目錄 什么是梯度增強特征選擇&#xff08;GBFS&#xff09; 為什么 GBM 適合做特征選擇 GBFS 的一般步驟 代碼示例 什么是梯度增強特征選擇&#xff08;GBFS&#xff09; GBFS 并非一個像 Lasso 或隨機森林那樣有嚴格標準定義的獨立算法&#xff0c;而是一種基于梯度提升機…