「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Streamsを使用してJavaで最大値と最小値を計算するにはどうすればよいですか?

Streamsを使用してJavaで最大値と最小値を計算するにはどうすればよいですか?

2024 年 11 月 18 日に公開
ブラウズ:841

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

この投稿では、Java Streams API を使用して要素のコレクションの最大値と最小値を計算する方法を説明します。これを行うには、Stream クラスの max() メソッドと min() メソッドを使用します。これらのメソッドを使用すると、カスタム コンパレーターを使用して、要素のコレクションの最大値と最小値をそれぞれ取得できます。

List タイプのリストがあり、Exam が 2 つのプロパティ名とグレードを持つレコードであり、最高グレードと最低グレードの試験を取得したいとします。

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 を取得することで、この目的で Stream クラスの max() メソッドと min() メソッドを使用できます。 Java バージョンが max() メソッドと min() メソッドをサポートしていない場合は、collect() メソッドを使用して、Collectors.maxBy() または Collectors.minBy() のいずれかのパラメータとして Collector を渡すことができます。パーソナライズされたコンパレーター。最近のバージョンの Java でこの最後のオプションを使用すると、IDE 自体がそれを max() メソッドまたは min() メソッドに変更することを提案します。

まず、昇順で成績を取得できる Comparator タイプのカスタム コンパレーターを作成しましょう。

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

例として、このコンパレータは、最初の試験の成績が 2 番目の試験の成績より小さい場合は負の数を返し、それらが等しい場合は 0 を返し、最初の試験の成績が次の試験の成績より大きい場合は正の数を返します。 2 つ目は、詳細については、Comparator インターフェイスがどのように機能するかを説明する投稿へのリンクを参照してください。

このコンパレータは、Comparator クラスの CompareDouble() メソッドを使用する別の方法で定義できます。これにより、コンパレータを手動で記述することなく、オブジェクトから double 値を抽出する関数からコンパレータを作成できます。

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

この定義では、コンパレーターは、Exam 型のオブジェクトを受け取り、grade プロパティの値を抽出し、Double データ型を使用して値を比較する必要があることが指示されています。

これら 2 つの方法は同等であり、同じ意味で使用できます。2 番目の方法は、最初は理解するのが少し難しいかもしれませんが、一度理解すると、書くのも読むのも簡単になります。

これでコンパレーターが完成しました。あとはそれを max() メソッドと min() メソッドで使用して、それぞれ最高スコアと最低スコアの試験を取得するだけです。

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

この場合、Optional は、それぞれ最高スコアと最低スコアの試験で取得されます。検査リストが空の場合は、Optional.empty() が返されます。 Optional の値を取得するには、Consumer を受け取り、値が存在する場合は引数として渡されたコードを実行する ifPresent() メソッドを使用できます。

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 インターフェイスを使用して要素のコレクションの最大値と最小値を取得できます。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/asjordi/como-calcular-el-maximo-y-minimo-en-java-usando-streams-2fca?1 侵害がある場合は、study_golang@163 までご連絡ください。 .comを削除してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3