Как суммировать список целых чисел с streamами java?

Я хочу суммировать список целых чисел. Он работает следующим образом, но синтаксис не кажется правильным. Может ли код быть оптимизирован?

Map integers; integers.values().stream().mapToInt(i -> i).sum(); 

6 Solutions collect form web for “Как суммировать список целых чисел с streamами java?”

Это будет работать, но i -> i делает автоматическую распаковку, поэтому она «чувствует» странность. Любое из следующего будет работать и лучше объяснить, что делает компилятор под капотом с вашим исходным синтаксисом:

 integers.values().stream().mapToInt(i -> i.intValue()).sum(); integers.values().stream().mapToInt(Integer::intValue).sum(); 

Я предлагаю еще 2 варианта:

 integers.values().stream().mapToInt(Integer::intValue).sum(); integers.values().stream().collect(Collectors.summingInt(Integer::intValue)); 

Второй использует Collectors.summingInt() collector, есть также summingLong() collector, который вы использовали бы с mapToLong .


И третий вариант: Java 8 представляет собой очень эффективный аккумулятор LongAdder предназначенный для ускорения суммирования в параллельных streamах и многопоточных средах. Вот пример использования:

 LongAdder a = new LongAdder(); map.values().parallelStream().forEach(a::add); sum = a.intValue(); 

Из документов

Операции сокращения Операция сокращения (также называемая сгибом) принимает последовательность входных элементов и объединяет их в один итоговый результат путем повторного применения операции объединения, например, нахождение суммы или максимума набора чисел или накопление элементов в список. Классы streamов имеют несколько форм общих операций сокращения, называемых reduce () и collect (), а также несколько специализированных редукционных форм, таких как sum (), max () или count ().

Конечно, такие операции могут быть легко реализованы как простые последовательные циклы, как в:

 int sum = 0; for (int x : numbers) { sum += x; } 

Тем не менее, есть веские причины предпочесть операцию уменьшения по сравнению с таким мутационным накоплением, как выше. Мало того, что сокращение «более абстрактно» – оно работает как с streamом в целом, а не с отдельными элементами, но правильно построенная операция сокращения по своей сути является параллелизуемой, если функции (функции), используемые для обработки элементов, являются ассоциативными и без гражданства. Например, учитывая stream чисел, для которого мы хотим найти сумму, мы можем написать:

 int sum = numbers.stream().reduce(0, (x,y) -> x+y); 

или:

 int sum = numbers.stream().reduce(0, Integer::sum); 

Эти операции сокращения могут выполняться безопасно параллельно с практически без изменений:

 int sum = numbers.parallelStream().reduce(0, Integer::sum); 

Итак, для карты вы будете использовать:

 integers.values().stream().mapToInt(i -> i).reduce(0, (x,y) -> x+y); 

Или:

 integers.values().stream().reduce(0, Integer::sum); 

Вы можете использовать метод уменьшения:

 long sum = result.stream().map(e -> e.getCreditAmount()).reduce(0L, (x, y) -> x + y); 

или

 long sum = result.stream().map(e -> e.getCreditAmount()).reduce(0L, Integer::sum); 

Вы можете использовать метод collect для добавления списка целых чисел.

 List list = Arrays.asList(2, 4, 5, 6); int sum = list.stream().collect(Collectors.summingInt(Integer::intValue)); 

Вы можете использовать reduce() чтобы суммировать список целых чисел.

 int sum = integers.values().stream().reduce(0, Integer::sum); 
  • Получение списка из java.util.stream.Stream в Java 8
  • Является ли это ошибкой в ​​Files.lines (), или я что-то не понимаю о параллельных streamах?
  • Коллекция для streamовой передачи в новую коллекцию
  • Почему filter () после того, как flatMap () «не полностью» ленив в streamах Java?
  • Как преобразовать stream Java 8 в массив?
  • В Java, как эффективно и элегантно потопить потомков узла дерева?
  • Параллельные streamи, коллекторы и безопасность streamов
  • Поддерживает ли Stream.forEce порядок столкновений последовательных streamов?
  • Лучший подход к обработке исключений функциональным способом
  • Сбор последовательных пар из streamа
  • Как создать stream из массива?
  • Давайте будем гением компьютера.