Хобрук: Ваш путь к мастерству в программировании

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

У меня есть список Integer list и из list.stream() я хочу максимальное значение.

Какой самый простой способ? Нужен ли мне компаратор?

13.07.2015


Ответы:


1

Вы можете преобразовать поток в 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();
13.07.2015
  • Было бы интересно узнать, какой из них более эффективен. 05.08.2016
  • Могу я спросить, почему, Тагир? 15.08.2016
  • @elect сначала распаковывает все целые числа, а затем сравнивает неупакованные. 2-е, 3-е и 4-е решения выполняют распаковку при каждом сравнении, эффективно выполняя в два раза больше операций распаковки. Последний вычисляет больше статистических данных (таких как сумма и минимум), что здесь не нужно, но, безусловно, займет некоторое время. 16.08.2016
  • Если вы хотите просто получить int, то mapToInt(...).max().getAsInt() или reduce(...).get() к цепочкам методов 06.04.2017
  • Привет. Как насчет наличия нулей в списке ввода? Если вы поместите List‹Integer› list = Arrays.asList(null, 9, 11, 7, 5, null); то каждый из предложенных вариантов терпит неудачу 03.10.2017
  • @ Богдан, это решаемо, хотя, по-видимому, это не требовалось. Тем не менее, вы можете опубликовать свой собственный ответ, охватывающий эту ситуацию. 05.10.2017

  • 2

    Другая версия может быть:

    int maxUsingCollectorsReduce = list.stream().collect(Collectors.reducing(Integer::max)).get();
    
    25.02.2016

    3

    Правильный код:

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

    or

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

    4

    Вы также можете использовать приведенный ниже код:

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

    Другая альтернатива:

    list.sort(Comparator.reverseOrder()); // max value will come first
    int max = list.get(0);  
    
    10.04.2019

    5

    С потоком и уменьшением

    Optional<Integer> max = list.stream().reduce(Math::max);
    
    03.08.2018
  • Кажется, вы дважды опубликовали этот ответ и удалили другой, но, как я прокомментировал другой, это решение уже включено в ответ Тагира (с Integer::max, но это точно то же самое). 03.08.2018

  • 6

    Вы можете использовать int max= Stream.of(1,2,3,4,5).reduce(0,(a,b)->Math.max(a,b)); работает как для положительных, так и для отрицательных чисел

    13.06.2017
  • Вы должны начать с Integer.MIN_VALUE, чтобы он работал с отрицательными числами. 03.08.2018

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

  • 8
  • Есть и другие ответы на вопрос ОП, и они были опубликованы много лет назад. При публикации ответа убедитесь, что вы добавили либо новое решение, либо существенно лучшее объяснение, особенно при ответе на старые вопросы. 15.04.2019
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...