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();

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));

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();

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);

0

Ze strumieniem i zmniejsz

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

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);  

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

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


Powinieneś zacząć od, Integer.MIN_VALUEaby działał z liczbami ujemnymi.
Didier L
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.