Java 8でストリームを使用して整数から最大値を見つける方法は?


93

私はのリストを持っているInteger listからlist.stream()、私は最大値を求めています。最も簡単な方法は何ですか?コンパレータは必要ですか?



15
ストリームを使用する理由はあるかもしれませんが、忘れないでくださいCollections.max..
Alexis C.

回答:


203

ストリームをIntStream次のいずれかに変換できます。

OptionalInt max = list.stream().mapToInt(Integer::intValue).max();

または、自然順序コンパレータを指定します。

Optional<Integer> max = list.stream().max(Comparator.naturalOrder());

または、reduce操作を使用します。

Optional<Integer> max = list.stream().reduce(Integer::max);

または、コレクターを使用します。

Optional<Integer> max = list.stream().collect(Collectors.maxBy(Comparator.naturalOrder()));

または、IntSummaryStatisticsを使用します。

int max = list.stream().collect(Collectors.summarizingInt(Integer::intValue)).getMax();

16
どちらがより効率的かを知るのは興味深いでしょう。
Roland

2
なぜですか、タギル?
選出

23
@elect、最初にすべての整数のボックス化を解除し、次にボックス化解除された整数を比較します。2番目、3番目、4番目のソリューションは、比較ごとにボックス化解除を実行し、ボックス化解除操作を2倍効率的に実行します。最後の1つは、ここでは不要な追加の統計(合計や分など)を計算しますが、確かに時間がかかります。
Tagir Valeev

int、それから、mapToInt(...).max().getAsInt()または reduce(...).get()メソッドチェーンを取得する場合
Andrejs

1
@ボグダン、これは解決可能ですが、明らかに問題ではありませんでした。それでも、この状況をカバーする独自の回答を投稿できます。
Tagir Valeev 2017年

10
int max = list.stream().reduce(Integer.MIN_VALUE, (a, b) -> Integer.max(a, b));

8
これは、すべての値が正の場合にのみ機能します。reduce()では、0ではなくInteger.MIN_VALUEを使用してください。
rolika


3

正しいコード:

int max = list.stream().reduce(Integer.MIN_VALUE, (a, b) -> Integer.max(a, b));

または

int max = list.stream().reduce(Integer.MIN_VALUE, Integer::max);

0

ストリームと削減

Optional<Integer> max = list.stream().reduce(Math::max);

この回答を2回投稿してもう1つを削除したようですが、もう1つについてコメントしたように、この解決策は既にタギルの回答に含まれています(Integer::maxただし、まったく同じです)。
Didier L

0

以下のコードを使用することもできます:

int max = list.stream().max(Comparator.comparing(Integer::valueOf)).get();

別の選択肢:

list.sort(Comparator.reverseOrder()); // max value will come first
int max = list.get(0);  

0
int value = list.stream().max(Integer::compareTo).get();
System.out.println("value  :"+value );

3
OPの質問を提供する他の回答があり、それらは何年も前に投稿されました。回答を投稿するときは、特に古い質問に回答する場合は、新しいソリューションまたは大幅に優れた説明を追加してください。
help-info.de

-2

int max = Stream.of(1,2,3,4,5).reduce(0、(a、b)-> Math.max(a、b));を使用できます。正の数と負の数の両方で機能します


あなたはInteger.MIN_VALUEそれを負の数で動作させるためにから始める必要があります。
Didier L
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.