Java ストリームで Max 関数を使用してすべての最大値を返す
Java 8 のラムダ ストリームで max 関数を利用すると、シナリオに矛盾が生じる可能性がありますここで、複数のオブジェクトは同じ最大値を生成します。この関数は、すべての実行可能な候補を評価または考慮することなく、任意の代表値を出力します。
この制限に対処するには、すべての最大値を正確に取得するための代替方法が必要です。残念ながら、単純なアプローチは利用できず、部分的な結果を保持するにはコレクションを使用する必要があります。
2 パス ソリューション
コレクションに保存された入力の場合 (List<文字列>リスト)、2 段階のプロセスを使用できます:
シングルパス ソリューション (ストリーム)
ストリームを使用したシングルパス シナリオに取り組むには、カスタム コレクターは、提供された Comparator に基づいて構築できます。
static <T> Collector<T, ?, List<T>> maxList(Comparator<? super T> comp) { return Collector.of( ArrayList::new, (list, t) -> { int c; if (list.isEmpty() || (c = comp.compare(t, list.get(0))) == 0) { list.add(t); } else if (c > 0) { list.clear(); list.add(t); } }, (list1, list2) -> { // Processing for list merging logic } ); }
ストリームでこのコレクターを利用するには、次のようにします。収集を呼び出します:
Stream<String> input = ... ; List<String> result = input.collect(maxList(comparing(String::length)));
以上が`max` 関数を使用して Java ストリームからすべての最大値を返す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。