2015-07-13 9 views
34

Mam listę Integerlist i od list.stream() Chcę maksymalnej wartości. Jaki jest najprostszy sposób? Czy potrzebuję komparatora?jak znaleźć maksymalną wartość z Integer przy użyciu strumienia w java 8?

+1

Przeczytaj javadoc: http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#max-java.util.Comparator -, http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#naturalOrder-- –

+9

Możliwe, że masz powody, aby używać strumienia, ale nie zapomnij o kolekcjach. max' .. –

Odpowiedz

105

Można też przekształcić strumień IntStream:

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

lub określić porównawczy naturalnego porządku:

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

Albo użyć zmniejszyć działanie:

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

Albo użyć 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(); 
+5

Byłoby interesujące dowiedzieć się, który z nich jest bardziej wydajny. – Roland

+1

@Roland Chciałbym zagłosować na pierwszy. –

+0

Czy mogę zapytać dlaczego, Tagir? – elect

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

Działa to tylko, jeśli wszystkie twoje wartości są pozytywne. Użyj wartości Integer.MIN_VALUE zamiast 0 w reduce(). – rolika

3

Inna wersja mogą być:

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

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

Można użyć int max = strumień.of (1,2,3,4,5) .reduce (0, (a, b) -> Math.max (a, b)); działa dla liczb dodatnich i ujemnych

+1

To nie działa dla negatywów. – shmosel

Powiązane problemy