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

pcb*_*abu 83 java-8 java-stream

我有一个列表,Integer listlist.stream()我想要的最大值.什么是最简单的方法?我需要比较器吗?

Tag*_*eev 182

您可以将流转换为IntStream:

OptionalInt max = list.stream().mapToInt(Integer::intValue).max();
Run Code Online (Sandbox Code Playgroud)

或者指定自然顺序比较器:

Optional<Integer> max = list.stream().max(Comparator.naturalOrder());
Run Code Online (Sandbox Code Playgroud)

或者使用reduce操作:

Optional<Integer> max = list.stream().reduce(Integer::max);
Run Code Online (Sandbox Code Playgroud)

或使用收藏家:

Optional<Integer> max = list.stream().collect(Collectors.maxBy(Comparator.naturalOrder()));
Run Code Online (Sandbox Code Playgroud)

或者使用IntSummaryStatistics:

int max = list.stream().collect(Collectors.summarizingInt(Integer::intValue)).getMax();
Run Code Online (Sandbox Code Playgroud)

  • @elect,首先将所有整数取消装箱,然后比较未装箱的整数.第二,第三和第四解决方案在每次比较中进行拆箱,有效地进行两次拆箱操作.最后一个计算更多的统计数据(如sum和min),这在这里是不必要的,但肯定需要一些时间. (23认同)
  • 知道哪一个更有效率会很有趣. (13认同)
  • @Roland我会投票给第一个. (3认同)
  • 请问为什么,塔吉尔? (2认同)

小智 9

int max = list.stream().reduce(Integer.MIN_VALUE, (a, b) -> Integer.max(a, b));
Run Code Online (Sandbox Code Playgroud)

  • 如果您的所有值均为正数,则此方法有效.在reduce()中使用Integer.MIN_VALUE而不是0. (6认同)