この投稿では、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 の最近のバージョンでは、カスタム コンパレータを渡し、その結果で Optional
まず、昇順で成績を取得できる Comparator
ComparatorbyGradeAsc = (e1, e2) -> (int) (e1.grade() - e2.grade());
例として、このコンパレータは、最初の試験の成績が 2 番目の試験の成績より小さい場合は負の数を返し、それらが等しい場合は 0 を返し、最初の試験の成績が次の試験の成績より大きい場合は正の数を返します。 2 つ目は、詳細については、Comparator インターフェイスがどのように機能するかを説明する投稿へのリンクを参照してください。
このコンパレータは、Comparator クラスの CompareDouble() メソッドを使用する別の方法で定義できます。これにより、コンパレータを手動で記述することなく、オブジェクトから double 値を抽出する関数からコンパレータを作成できます。
ComparatorbyGradeAscClean = Comparator.comparingDouble(Exam::grade);
この定義では、コンパレーターは、Exam 型のオブジェクトを受け取り、grade プロパティの値を抽出し、Double データ型を使用して値を比較する必要があることが指示されています。
これら 2 つの方法は同等であり、同じ意味で使用できます。2 番目の方法は、最初は理解するのが少し難しいかもしれませんが、一度理解すると、書くのも読むのも簡単になります。
これでコンパレーターが完成しました。あとはそれを max() メソッドと min() メソッドで使用して、それぞれ最高スコアと最低スコアの試験を取得するだけです。
var highestGrade = exams.stream().max(byGradeAscClean); var lowestGrade = exams.stream().min(byGradeAscClean);
この場合、Optional
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
または、単に参照メソッドを引数として渡してオプションの値を出力します。オプションが空の場合は何も出力されません。それ以外の場合は、Exam オブジェクトの toString() メソッドを呼び出すことによってオプションの値が出力されます。 .
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