」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Java中如何使用Streams計算最大值和最小值?

Java中如何使用Streams計算最大值和最小值?

發佈於2024-11-18
瀏覽:407

¿Cómo calcular el máximo y mínimo en Java usando Streams?

在這篇文章中,我們將了解如何使用 Java Streams API 來計算元素集合的最大值和最小值。為此,我們將使用 Stream 類別的 max() 和 min() 方法。這些方法允許我們使用自訂比較器分別取得元素集合的最大值和最小值。

假設我們有一個類型為 List 的列表,其中 Exam 是一筆具有 name 和 Grade 兩個屬性的記錄,我們想要取得成績最高和成績最低的考試。

public record Exam(String name, Double grade) { }
var exams = Arrays.asList(
        new Exam("Alice", 9.5),
        new Exam("Bob", 6.0),
        new Exam("Charlie", 7.5),
        new Exam("David", 8.0),
        new Exam("Eve", 8.5)
);

在最新版本的 Java 中,您可以使用 Stream 類別的 max() 和 min() 方法來實現此目的,方法是傳遞自訂比較器並取得帶有結果的Optional。如果Java版本不支援max()和min()方法,則可以使用collect()方法傳遞Collector作為參數,Collectors.maxBy()或Collectors.minBy(),然後依序傳遞一個Collectors.maxBy()或Collectors. minBy(),個人化比較器。如果您在最新版本的 Java 中使用最後一個選項,IDE 本身會建議將其變更為 max() 或 min() 方法。

讓我們先建立一個 Comparator 類型的自訂比較器,它允許我們按升序獲取成績。

Comparator byGradeAsc = (e1, e2) -> (int) (e1.grade() - e2.grade());

例如,如果第一次考試的成績低於第二次考試的成績,則該比較器將返回負數;如果相等,則返回零;如果第一次考試的成績大於第二次考試的成績,則該比較器將傳回正數。第二個,有關更多信息,您可以查閱此鏈接,該鏈接指向解釋比較器介面如何工作的帖子。

可以使用 Comparator 類別的 ComparisonDouble() 方法以另一種方式定義該比較器,該方法允許我們從從物件中提取雙精度值的函數建立比較器,而無需手動編寫比較器。

Comparator byGradeAscClean = Comparator.comparingDouble(Exam::grade);

在此定義中,比較器被告知它必須採用 Exam 類型的對象,提取 Grade 屬性的值並使用 Double 資料類型比較這些值。

這兩種方式是等價的,可以互換使用,第二種方式一開始可能有點難以理解,但是一旦理解了它就更容易編寫和閱讀。

既然你有了比較器,剩下的就是在 max() 和 min() 方法中使用它來分別獲得最高和最低分數的考試。

var highestGrade = exams.stream().max(byGradeAscClean);
var lowestGrade = exams.stream().min(byGradeAscClean);

在這種情況下,將分別通過最高分和最低分的考試獲得可選。如果考試清單為空,將返回Optional.empty()。要取得Optional的值,您可以使用ifPresent()方法,該方法接收Consumer並執行作為參數傳遞給它的程式碼(如果值存在)。

highestGrade.ifPresent(ex -> System.out.println("Highest grade: "   ex.name()   " "   ex.grade()));
lowestGrade.ifPresent(ex -> System.out.println("Lowest grade: "   ex.name()   " "   ex.grade()));

// Output
Highest grade: Alice 9.5
Lowest grade: Bob 6.0

或簡單地傳遞一個引用方法作為參數來列印Optional的值,如果Optional為空則不會列印任何內容,否則將透過呼叫Exam物件的toString()方法來列印Optional的值

highestGrade.ifPresent(System.out::println);
lowestGrade.ifPresent(System.out::println);

// Output
Exam[name=Alice, grade=9.5]
Exam[name=Bob, grade=6.0]

透過這種方式,您可以使用 Java Streams API 和 Comparator 介面來取得元素集合的最大值和最小值。

版本聲明 本文轉載於:https://dev.to/asjordi/como-calcular-el-maximo-y-minimo-en-java-usando-streams-2fca?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    稱量()和ast.literal_eval()中的Python Security 在使用用戶輸入時,必須優先確保安全性。強大的Python功能Eval()通常是作為潛在解決方案而出現的,但擔心其潛在風險。 This article delves into the differences betwee...
    程式設計 發佈於2025-07-09
  • 編譯器報錯“usr/bin/ld: cannot find -l”解決方法
    編譯器報錯“usr/bin/ld: cannot find -l”解決方法
    錯誤:“ usr/bin/ld:找不到-l “ 此錯誤表明鏈接器在鏈接您的可執行文件時無法找到指定的庫。為了解決此問題,我們將深入研究如何指定庫路徑並將鏈接引導到正確位置的詳細信息。 添加庫搜索路徑的一個可能的原因是,此錯誤是您的makefile中缺少庫搜索路徑。要解決它,您可以在鏈接器命令中添...
    程式設計 發佈於2025-07-09
  • 如何使用“ JSON”軟件包解析JSON陣列?
    如何使用“ JSON”軟件包解析JSON陣列?
    parsing JSON與JSON軟件包 QUALDALS:考慮以下go代碼:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    程式設計 發佈於2025-07-09
  • Java中Lambda表達式為何需要“final”或“有效final”變量?
    Java中Lambda表達式為何需要“final”或“有效final”變量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    程式設計 發佈於2025-07-09
  • 如何使用Depimal.parse()中的指數表示法中的數字?
    如何使用Depimal.parse()中的指數表示法中的數字?
    在嘗試使用Decimal.parse(“ 1.2345e-02”中的指數符號表示法表示的字符串時,您可能會遇到錯誤。這是因為默認解析方法無法識別指數符號。 成功解析這樣的字符串,您需要明確指定它代表浮點數。您可以使用numbersTyles.Float樣式進行此操作,如下所示:[&& && && ...
    程式設計 發佈於2025-07-09
  • 如何使用Python有效地以相反順序讀取大型文件?
    如何使用Python有效地以相反順序讀取大型文件?
    在python 中,如果您使用一個大文件,並且需要從最後一行讀取其內容,則在第一行到第一行,Python的內置功能可能不合適。這是解決此任務的有效解決方案:反向行讀取器生成器 == ord('\ n'): 緩衝區=緩衝區[:-1] ...
    程式設計 發佈於2025-07-09
  • 在GO中構造SQL查詢時,如何安全地加入文本和值?
    在GO中構造SQL查詢時,如何安全地加入文本和值?
    在go中構造文本sql查詢時,在go sql queries 中,在使用conting and contement和contement consem per時,尤其是在使用integer per當per當per時,per per per當per. [&​​​​&&&&&&&&&&&&&&&默元組方...
    程式設計 發佈於2025-07-09
  • FastAPI自定義404頁面創建指南
    FastAPI自定義404頁面創建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    程式設計 發佈於2025-07-09
  • Python讀取CSV文件UnicodeDecodeError終極解決方法
    Python讀取CSV文件UnicodeDecodeError終極解決方法
    在試圖使用已內置的CSV模塊讀取Python中時,CSV文件中的Unicode Decode Decode Decode Decode decode Error讀取,您可能會遇到錯誤的錯誤:無法解碼字節 在位置2-3中:截斷\ uxxxxxxxx逃脫當CSV文件包含特殊字符或Unicode的路徑逃...
    程式設計 發佈於2025-07-09
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-07-09
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-07-09
  • 您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    在javascript console 中顯示顏色是可以使用chrome的控制台顯示彩色文本,例如紅色的redors,for for for for錯誤消息? 回答是的,可以使用CSS將顏色添加到Chrome和Firefox中的控制台顯示的消息(版本31或更高版本)中。要實現這一目標,請使用以下...
    程式設計 發佈於2025-07-09
  • 如何在Chrome中居中選擇框文本?
    如何在Chrome中居中選擇框文本?
    選擇框的文本對齊:局部chrome-inly-ly-ly-lyly solument 您可能希望將文本中心集中在選擇框中,以獲取優化的原因或提高可訪問性。但是,在CSS中的選擇元素中手動添加一個文本 - 對屬性可能無法正常工作。 初始嘗試 state)</option> < o...
    程式設計 發佈於2025-07-09
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-07-09
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    在嘗試為JavaScript對象創建動態鍵時,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正確的方法採用方括號: jsobj ['key''i] ='example'1; 在JavaScript中,數組是一...
    程式設計 發佈於2025-07-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3