如何在Java 8中使用流从Integer中找到最大值?


Answers:


203

您可以将流转换为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();

15
知道哪个效率更高会很有趣。
罗兰

2
请问为什么,塔吉尔?
选择

23
@elect,它首先将所有整数取消装箱,然后比较未装箱的整数。第二,第三和第四种解决方案在每次比较时都执行拆箱操作,从而有效地执行了两倍的拆箱操作。最后一个计算更多的统计信息(例如总和和最小值),这在这里是不必要的,但是肯定会花费一些时间。
塔吉尔·瓦列夫

如果您只想获取一个int,则mapToInt(...).max().getAsInt()或者链接 reduce(...).get()到方法链
Andrejs

1
@Bogdan,这是可以解决的,尽管显然不是必需的。不过,您可以发布自己的答案来解决这种情况。
塔吉尔·瓦列耶夫(Tagir Valeev)17-10-5

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

8
仅当您所有的值均为正时,此方法才有效。在reduce()中使用Integer.MIN_VALUE而不是0。
罗里卡


3

正确的代码:

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

要么

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

0

随着流和减少

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

看来您两次发布了此答案,并删除了另一个答案,但是正如我对另一个答案所做的评论一样,Tagir的答案中已经包含了该解决方案(与之Integer::max完全相同)。
Didier L

0

您还可以使用以下代码片段:

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

另一种选择:

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
还提供了OP的问题的其他答案,并且这些答案已在多年前发布。发布答案时,请确保添加新的解决方案或实质上更好的解释,尤其是在回答较旧的问题时。
help-info.de

-2

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


您应该从Integer.MIN_VALUE使其开始使用负数开始。
Didier L
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.