как найти максимальное значение из целого числа с помощью потока в java 8?


93

У меня есть список, Integer listиз которого list.stream()я хочу максимальное значение. Какой самый простой способ? Мне нужен компаратор?



15
У вас могут быть причины использовать Stream, но не забывайте Collections.max..
Alexis C.

Ответы:


205

Вы можете преобразовать поток в 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();

16
Было бы интересно узнать, какой из них эффективнее.
Роланд

2
Могу я спросить почему, Тагир?
избрать

23
@elect, он сначала распаковывает все целые числа, затем сравнивает распакованные. 2-е, 3-е и 4-е решения выполняют распаковку при каждом сравнении, эффективно выполняя вдвое больше операций распаковки. Последний вычисляет дополнительную статистику (например, сумму и мин), которая здесь не нужна, но, безусловно, займет некоторое время.
Тагир Валеев

Если вы хотите просто получить int, то mapToInt(...).max().getAsInt()или reduce(...).get()в цепочки методов
Андрейс

1
@Bogdan, это решаемо, хотя, по-видимому, не требовалось. Тем не менее, вы можете опубликовать свой собственный ответ, касающийся этой ситуации.
Тагир Валеев

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

8
Это работает, только если все ваши ценности положительны. Используйте Integer.MIN_VALUE вместо 0 в reduce ().
rolika


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

Кажется, вы дважды опубликовали этот ответ и удалили другой, но, как я прокомментировал другой, это решение уже включено в ответ Тагира ( 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чтобы заставить его работать с отрицательными числами.
Дидье Л.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.