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

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();
Tagir Valeev
quelle
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));
Greifer
quelle
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();
Olexandra Dmytrenko
quelle
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);
Golubtsoff
quelle
0

Mit Stream und reduzieren

Optional<Integer> max = list.stream().reduce(Math::max);
Michal Kalman
quelle
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);  
Vaseph
quelle
0
int value = list.stream().max(Integer::compareTo).get();
System.out.println("value  :"+value );
Shalika
quelle
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

Sruthi
quelle
Sie sollten damit beginnen Integer.MIN_VALUE, dass es mit negativen Zahlen funktioniert.
Didier L