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

93

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

pcbabu
источник
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 maxUsingCollectorsReduce = list.stream().collect(Collectors.reducing(Integer::max)).get();
Александра Дмитренко
источник
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чтобы заставить его работать с отрицательными числами.
Дидье Л.