як знайти максимальне значення з цілого числа за допомогою потоку в Java 8?


93

У мене є список Integer listі з, list.stream()я хочу максимальне значення. Який найпростіший спосіб? Чи потрібен компаратор?



15
У вас можуть бути причини використовувати потік, але не забувайте Collections.max..
Алексіс С.

Відповіді:


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, він спочатку розпаковує всі цілі числа, а потім порівнює розпаковані. Друге, третє та четверте рішення роблять розпакування на кожному порівнянні ефективно, роблячи вдвічі більше операцій розпакування. Останній обчислює більше статистичних даних (як сума та хв), що тут непотрібно, але, безумовно, займе трохи часу.
Тагір Валєєв

Якщо ви хочете просто отримати 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 у Redu ().
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
Є й інші відповіді, які надають питання ОП, і вони були опубліковані багато років тому. Розміщуючи відповідь, будь ласка, переконайтесь, що ви додали або нове рішення, або значно кращі пояснення, особливо коли відповідаєте на старіші запитання.
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.