2015-07-13 101 views
34

我有一个Integerlistlist.stream()的列表我想要的最大值。最简单的方法是什么?我需要比较器吗?如何在Java 8中使用流的Integer查找最大值?

+1

阅读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

您可能有理由使用Stream,但不要忘记'Collections。 max .. .. –

回答

105

您既可以将流转换为IntStream

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

或指定的自然顺序比较:

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

或者使用减少操作:

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

或者使用采集器:

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

或者使用IntSummaryStatistics:

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

会很有趣地知道哪一个更有效率。 – Roland

+1

@罗兰我会为第一个投票。 –

+0

请问为什么Tagir? – elect

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

只有所有的值都是正值,这才有效。在reduce()中使用Integer.MIN_VALUE而不是0。 – rolika

3

另一个版本可能是:

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

正确的代码:

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

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

您可以使用int max = Stream.of(1,2,3,4,5).reduce(0,(a,b) - > Math.max(a,b)); 适用于正数和负数

+1

它不适用于否定。 – shmosel