Wie finde ich den Maximalwert einer Ganzzahl mithilfe eines Streams in Java 8?


92

Ich habe eine Liste von Integer listund von der list.stream()ich den Maximalwert haben möchte. Was ist der einfachste Weg? Benötige ich einen Komparator?



14
Sie können Ihre Gründe haben, einen Stream zu verwenden, aber vergessen Sie nicht Collections.max..
Alexis C.

Antworten:


201

Sie können den Stream entweder konvertieren in IntStream:

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

Oder geben Sie den natürlichen Ordnungskomparator an:

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

Oder verwenden Sie Reduktionsvorgang:

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

Oder verwenden Sie Collector:

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

Oder verwenden Sie IntSummaryStatistics:

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

15
Es wäre interessant zu wissen, welches effizienter ist.
Roland

2
Darf ich fragen warum, Tagir?
Wählen Sie den

23
@elect entpackt zuerst alle Ganzzahlen und vergleicht dann die nicht entpackten. 2., 3. und 4. Lösung führen das Unboxing bei jedem Vergleich effektiv durch und führen doppelt so viele Unboxing-Vorgänge durch. Der letzte berechnet mehr Statistiken (wie Summe und Min.), Was hier nicht notwendig ist, aber sicherlich einige Zeit in Anspruch nehmen wird.
Tagir Valeev

Wenn Sie nur eine bekommen möchten int, dann mapToInt(...).max().getAsInt()oder reduce(...).get()zu den Methodenketten
Andrejs

1
@ Bogdan, dies ist lösbar, obwohl anscheinend nicht in Frage gestellt wurde. Trotzdem können Sie Ihre eigene Antwort zu dieser Situation posten.
Tagir Valeev

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

7
Dies funktioniert nur, wenn alle Ihre Werte positiv sind. Verwenden Sie in redu () Integer.MIN_VALUE anstelle von 0.
Rolika

3

Eine andere Version könnte sein:

int maxUsingCollectorsReduce = list.stream().collect(Collectors.reducing(Integer::max)).get();

3

Richtiger Code:

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

oder

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

0

Mit Stream und reduzieren

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

Es scheint, dass Sie diese Antwort zweimal gepostet und die andere entfernt haben, aber wie ich die andere kommentiert habe, ist diese Lösung bereits in Tagirs Antwort enthalten (mit, Integer::maxaber das ist genau das gleiche).
Didier L

0

Sie können auch den folgenden Code verwenden:

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

Eine andere Alternative:

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
Es gibt andere Antworten, die die Frage des OP stellen, und sie wurden vor vielen Jahren veröffentlicht. Stellen Sie beim Posten einer Antwort sicher, dass Sie entweder eine neue Lösung oder eine wesentlich bessere Erklärung hinzufügen, insbesondere wenn Sie ältere Fragen beantworten.
help-info.de

-2

Sie könnten int max = Stream.of (1,2,3,4,5) .reduce (0, (a, b) -> Math.max (a, b)) verwenden; funktioniert sowohl für positive als auch für negative Zahlen


Sie sollten damit beginnen Integer.MIN_VALUE, dass es mit negativen Zahlen funktioniert.
Didier L
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.