Java ストリームで複数の最大値を返す方法
Java Stream API では、max 関数は通常、次の最大要素の 1 つを返します。コンパレーターが提供されている場合はコレクション。しかし、すべての最大値が必要な場合、特に複数の要素が同じ最大値を持つ場合はどうなるでしょうか?
すべての最大値を返すためのトリック
残念ながら、Java API では、すべての最大値を取得する直接的な方法は提供されていません。ただし、回避策として、コレクターを使用して部分的な結果を保存することが必要になります。以下は、コンパレーターに基づいてコレクターを生成するヘルパー関数です。
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) -> { if (list1.isEmpty()) { return list2; } if (list2.isEmpty()) { return list1; } int r = comp.compare(list1.get(0), list2.get(0)); if (r < 0) { return list2; } else if (r > 0) { return list1; } else { list1.addAll(list2); return list1; } }); }
このコレクターは、コンパレーターに関して同等の要素のリストを維持します。結果をマージすると、コレクターはより大きな要素を含むリストを返します。要素が等しい場合、リストが追加されます。
ストリームでこのコレクタを使用するには、次のように適用するだけです:
Stream<String> input = ... ; List<String> result = input.collect(maxList(comparing(String::length)));
使用例
たとえば、ファイル内の最大長の文字列をすべて見つけてみましょう。 list.
List<String> strings = Arrays.asList("apple", "banana", "pear", "orange", "grapes", "kiwi"); Stream<String> stringStream = strings.stream(); List<String> maxStrings = stringStream.collect(maxList(Comparator.comparingInt(String::length))); System.out.println(maxStrings); // [apple, banana, grapes, orange]
この例では、maxList コレクターは、最大長のすべての文字列を含むリストを返します。
以上がJava ストリームからすべての最大値を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。