jak znaleźć maksymalną wartość z liczby całkowitej za pomocą strumienia w java 8?

Odpowiedzi:

205

Możesz przekonwertować strumień na IntStream:

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

Lub określ naturalny komparator kolejności:

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

Lub użyj zredukować operację:

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

Lub użyj kolektora:

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

Lub użyj IntSummaryStatistics:

int max = list.stream().collect(Collectors.summarizingInt(Integer::intValue)).getMax();
Tagir Valeev
źródło
16
Ciekawie byłoby wiedzieć, który z nich jest bardziej wydajny.
Roland,
2
Mogę zapytać dlaczego, Tagir?
wybierz
23
@elect, najpierw rozpakowuje wszystkie liczby całkowite, a następnie porównuje te, które nie zostały zapakowane. Rozwiązania 2, 3 i 4 wykonują rozpakowywanie przy każdym porównaniu, skutecznie wykonując dwa razy więcej operacji rozpakowywania. Ostatni oblicza więcej statystyk (takich jak suma i min), co jest tutaj niepotrzebne, ale z pewnością zajmie trochę czasu.
Tagir Valeev,
Jeśli chcesz po prostu dostać int, to mapToInt(...).max().getAsInt()lub reduce(...).get()do łańcuchów metod
Andrejs
1
@Bogdan, można to rozwiązać, chociaż najwyraźniej nie było to wymagane w pytaniu. Niemniej jednak możesz zamieścić własną odpowiedź dotyczącą tej sytuacji.
Tagir Valeev
10
int max = list.stream().reduce(Integer.MIN_VALUE, (a, b) -> Integer.max(a, b));
Chwytak
źródło
8
Działa to tylko wtedy, gdy wszystkie twoje wartości są pozytywne. Użyj Integer.MIN_VALUE zamiast 0 w reduktorze ().
rolika
3

Inną wersją może być:

int maxUsingCollectorsReduce = list.stream().collect(Collectors.reducing(Integer::max)).get();
Olexandra Dmytrenko
źródło
3

Prawidłowy kod:

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

lub

int max = list.stream().reduce(Integer.MIN_VALUE, Integer::max);
golubtsoff
źródło
0

Ze strumieniem i zmniejsz

Optional<Integer> max = list.stream().reduce(Math::max);
Michał Kalman
źródło
Wygląda na to, że opublikowałeś tę odpowiedź dwa razy i usunąłeś drugą, ale jak skomentowałem drugą, to rozwiązanie jest już uwzględnione w odpowiedzi Tagira (z, Integer::maxale to dokładnie to samo).
Didier L
0

Możesz również użyć poniższego wyciętego kodu:

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

Inna alternatywa:

list.sort(Comparator.reverseOrder()); // max value will come first
int max = list.get(0);  
Vaseph
źródło
0
int value = list.stream().max(Integer::compareTo).get();
System.out.println("value  :"+value );
Shalika
źródło
3
Istnieją inne odpowiedzi, które zawierają pytanie PO, i zostały one opublikowane wiele lat temu. Pisząc odpowiedź, upewnij się, że dodałeś nowe rozwiązanie lub znacznie lepsze wyjaśnienie, szczególnie w przypadku odpowiedzi na starsze pytania.
help-info.de
-2

Możesz użyć int max = Stream.of (1,2,3,4,5) .reduce (0, (a, b) -> Math.max (a, b)); działa zarówno dla liczb dodatnich, jak i ujemnych

Sruthi
źródło
Powinieneś zacząć od, Integer.MIN_VALUEaby działał z liczbami ujemnymi.
Didier L