在這篇文章中,我們將了解如何使用 Java Streams API 來計算元素集合的最大值和最小值。為此,我們將使用 Stream 類別的 max() 和 min() 方法。這些方法允許我們使用自訂比較器分別取得元素集合的最大值和最小值。
假設我們有一個類型為 List
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
讓我們先建立一個 Comparator
ComparatorbyGradeAsc = (e1, e2) -> (int) (e1.grade() - e2.grade());
例如,如果第一次考試的成績低於第二次考試的成績,則該比較器將返回負數;如果相等,則返回零;如果第一次考試的成績大於第二次考試的成績,則該比較器將傳回正數。第二個,有關更多信息,您可以查閱此鏈接,該鏈接指向解釋比較器介面如何工作的帖子。
可以使用 Comparator 類別的 ComparisonDouble() 方法以另一種方式定義該比較器,該方法允許我們從從物件中提取雙精度值的函數建立比較器,而無需手動編寫比較器。
ComparatorbyGradeAscClean = 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 介面來取得元素集合的最大值和最小值。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3