- Подведение итогов с Java потоками
- 1. Введение
- Дальнейшее чтение:
- Введение в Java 8 Потоки
- Руководство по Stream.reduce()
- Руководство для коллекционеров Java 8
- 2. Использование Stream.reduce()
- 3. Использование Stream.collect()
- 4. Использование IntStream.sum()
- 5. Использование Stream-sum с картой
- 6. Использование Stream-sum с объектами
- 7. Использование Stream-sum со строкой
- 8. Заключение
- Читайте ещё по теме:
- Суммирование чисел с помощью стримов Java
- Использование Stream.reduce()
- Использование Stream.collect()
- Использование IntStream.sum()
- Использование Stream#sum с map
- Использование Stream#sum с объектами
- Заключение
- Java 8 Sum: Array, Map and List Collection Example using reduce() and collect() Method
- Sum using IntStream.sum()
- Sum using Collectors.summingInt() with Stream.collect()
- Sum using Collectors.summarizingInt() with Stream.collect() and IntSummaryStatistics
- Sum using Stream.reduce() with BiFunction and BinaryOperator
- Sum using Stream.reduce() with Custom Method
- Sum of Array Example
- Sum of List Example
- Sum of List of Array Example
- Sum of Map Example
Подведение итогов с Java потоками
Краткое и практическое руководство по подведению итогов с помощью JAVA Stream API.
1. Введение
В этом быстром учебнике мы покажем различные способы расчет суммы цен, с помощью Поток API .
Для простоты, мы будем использовать integers в наших примерах. Тем не менее, мы можем применить те же методы для лонгов и удваивается, а также.
Дальнейшее чтение:
Введение в Java 8 Потоки
Руководство по Stream.reduce()
Руководство для коллекционеров Java 8
2. Использование Stream.reduce()
Stream.reduce () является терминальной операцией, которая выполняет уменьшение элементов потока .
Он применяет двоичного оператора (аккумулятора) к каждому элементу потока, где первым оператором является значение возврата предыдущего приложения, а вторым — текущий элемент потока.
В первом методе использования уменьшить () метод, функция аккумулятора является выражением лямбды, которое добавляет два Интегер ценностей и возвращает Интегер ценность:
Listintegers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .reduce(0, (a, b) -> a + b);
Таким же образом, мы можем использовать уже существующий метод Java :
Listintegers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .reduce(0, Integer::sum);
Или мы можем определить и использовать наш пользовательский метод:
public class ArithmeticUtils < public static int add(int a, int b) < return a + b; >>
Затем мы можем передать эту функцию в качестве параметра уменьшить () метод:
Listintegers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .reduce(0, ArithmeticUtils::add);
3. Использование Stream.collect()
Второй метод расчета суммы списка цен на интеграторы заключается в использовании собирать () эксплуатация терминала:
Listintegers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .collect(Collectors.summingInt(Integer::intValue));
Аналогичным образом, Коллекционеры класс обеспечивает summingLong () и подводя итогиDouble () методы расчета сумм лонгов и двойников соответственно.
4. Использование IntStream.sum()
API Stream предоставляет нам mapToInt () промежуточной операции, которая преобразует наш поток в IntStream объект .
Этот метод принимает картограф в качестве параметра, который он использует для преобразования, то, мы можем назвать сумма () метод расчета суммы элементов потока.
Давайте посмотрим быстрый пример того, как мы можем использовать его:
Listintegers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .mapToInt(Integer::intValue) .sum();
Таким же образом, мы можем использовать картаToLong () и картаToDouble () методы расчета сумм лонгов и двойников соответственно.
5. Использование Stream-sum с картой
Рассчитать сумму стоимости Структура < Map , во-первых, мы создаем поток из значений, этого Карта , затем мы применяем один из методов, которые мы использовали ранее.
Например, с помощью IntStream.sum () :
Integer sum = map.values() .stream() .mapToInt(Integer::valueOf) .sum();
6. Использование Stream-sum с объектами
Давайте представим, что у нас есть список объектов, и что мы хотим вычислить сумма всех значений данного поля из этих объектов.
public class Item < private int id; private Integer price; public Item(int id, Integer price) < this.id = id; this.price = price; >// Standard getters and setters >
Далее давайте представим, что мы хотим рассчитать общую цену всех пунктов следующего списка:
Item item1 = new Item(1, 10); Item item2 = new Item(2, 15); Item item3 = new Item(3, 25); Item item4 = new Item(4, 40); List- items = Arrays.asList(item1, item2, item3, item4);
В этом случае для расчета суммы с помощью методов, показанных в предыдущих примерах, необходимо вызвать карта () метод превратить наш поток в поток .
В результате, мы можем использовать Stream.reduce (), Stream.collect (), и IntStream.sum () для расчета суммы:
Integer sum = items.stream() .map(x -> x.getPrice()) .reduce(0, ArithmeticUtils::add);
Integer sum = items.stream() .map(x -> x.getPrice()) .reduce(0, Integer::sum);
Integer sum = items.stream() .map(item -> item.getPrice()) .reduce(0, (a, b) -> a + b);
Integer sum = items.stream() .map(x -> x.getPrice()) .collect(Collectors.summingInt(Integer::intValue));
items.stream() .mapToInt(x -> x.getPrice()) .sum();
7. Использование Stream-sum со строкой
Допустим, у нас есть Струнные объект, содержащий некоторые integers.
Чтобы рассчитать сумму этих интегеров, в первую очередь нам нужно конвертировать эту Струнные в Массив , то мы должны для фильтрации элементов, не отражаемых , и, наконец, конвертировать оставшиеся элементы этого массива в числа.
Давайте посмотрим все эти шаги в действии:
String string = "Item1 10 Item2 25 Item3 30 Item4 45"; Integer sum = Arrays.stream(string.split(" ")) .filter((s) -> s.matches("\\d+")) .mapToInt(Integer::valueOf) .sum();
8. Заключение
В этом учебнике мы увидели несколько методов расчета суммы списка интеграторов с помощью API Stream. Также мы использовали эти методы для расчета суммы значений данного поля списка объектов, суммы значений карты, а также чисел в пределах данного Струнные объект.
Как всегда, полный код доступен более на GitHub .
Читайте ещё по теме:
Суммирование чисел с помощью стримов Java
В этом коротком руководстве мы рассмотрим различные способы вычисления суммы целых чисел с помощью Stream API.
Для простоты в наших примерах мы будем использовать Integer числа, однако можно применить те же методы и к типам Long и Double.
Использование Stream.reduce()
Stream.reduce() – это терминальная операция, которая выполняет сокращение элементов в стриме.
Операция применяет бинарный оператор (аккумулятор) к каждому элементу в стриме, где первый операнд является возвращаемым значением предыдущего элемента, а второй – текущим элементом стрима.
В первом примере функция-аккумулятор представляет собой лямбда-выражение, которое складывает два целых значения и возвращает также целое значение:
List ints = Arrays.asList(1, 2, 3, 4); Integer sum = ints.stream() .reduce(0, (a, b) -> a + b);
Таким же образом мы можем использовать статический Java-метод Integer::sum:
List ints = Arrays.asList(1, 2, 3, 4); Integer sum = ints.stream() .reduce(0, Integer::sum);
Или мы можем определить и использовать наш пользовательский метод:
public class MathUtils < public static int add(int a, int b) < return a + b; >> //. List ints = Arrays.asList(1, 2, 3, 4); Integer sum = ints.stream() .reduce(0, MathUtils::add);
Использование Stream.collect()
Второй способ вычисления суммы списка целых чисел заключается в использовании терминальной операции collect():
List ints = Arrays.asList(1, 2, 3, 4); Integer sum = ints.stream() .collect(Collectors.summingInt(Integer::intValue));
Аналогично, класс Collectors предоставляет методы summingLong() и summingDouble() для вычисления сумм коллекций типов Long и Double соответственно.
Использование IntStream.sum()
Stream API предоставляет нам промежуточную операцию mapToInt(), которая преобразует наш стрим в объект IntStream.
Этот метод принимает mapper в качестве параметра, который он использует для выполнения преобразования, затем мы можем вызвать метод sum() для вычисления суммы элементов стрима.
Давайте посмотрим на короткий пример того, как мы можем его использовать:
List ints = Arrays.asList(1, 2, 3, 4); Integer sum = ints.stream() .mapToInt(Integer::intValue) .sum();
Таким же образом мы можем использовать методы mapToLong() и mapToDouble() для вычисления сумм коллекций типов Long и Double соответственно.
Использование Stream#sum с map
Чтобы вычислить сумму значений структуры данных Map , сначала мы создадим стрим из значений этого map. Далее применим один из методов, которые мы использовали ранее. Например, IntStream.sum():
Integer sum = map.values() .stream() .mapToInt(Integer::valueOf) .sum();
Использование Stream#sum с объектами
Давайте представим, что у нас есть список объектов и мы хотим вычислить сумму всех значений выбранного поля этих объектов.
public class Item < private int id; private Integer price; public Item(int id, Integer price) < this.id = id; this.price = price; >// стандартные геттеры и сеттеры >
Далее давайте представим, что мы хотим рассчитать итоговую цену всех товаров из следующего списка:
Item item1 = new Item(1, 5); Item item2 = new Item(2, 10); Item item3 = new Item(3, 15); Item item4 = new Item(4, 20); List items = Arrays.asList(item1, item2, item3, item4);
Чтобы вычислить сумму, используя методы, показанные в предыдущих примерах, нам нужно вызвать метод map() для преобразования нашего стрима в стрим целых чисел.
Можно использовать Stream.reduce(), Stream.collect() и IntStream.sum() для вычисления суммы:
Integer sum = items.stream() .map(x -> x.getPrice()) .reduce(0, ArithmeticUtils::add); sum = items.stream() .map(x -> x.getPrice()) .reduce(0, Integer::sum); sum = items.stream() .map(item -> item.getPrice()) .reduce(0, (a, b) -> a + b); sum = items.stream() .map(x -> x.getPrice()) .collect(Collectors.summingInt(Integer::intValue)); sum = items.stream() .mapToInt(x -> x.getPrice()) .sum();
Заключение
В этой статье мы рассмотрели несколько методов вычисления суммы списка целых чисел с помощью Stream API. Мы также использовали эти методы для вычисления суммы значений выбранного поля списка объектов и суммы значений map.
Java 8 Sum: Array, Map and List Collection Example using reduce() and collect() Method
On this page we will provide Java 8 sum of values of Array, Map and List collection example using reduce() and collect() method. There are various ways to calculate the sum of values in java 8. We can use IntStream.sum() . We can get sum from summary statistics. We can also create our own method to get the sum. We will discuss here different ways to calculate the sum.
Contents
Sum using IntStream.sum()
int sum = map.values().stream().mapToInt(i->i).sum(); int sum = list.stream().map(Line::getLength).mapToInt(Integer::intValue).sum();
Sum using Collectors.summingInt() with Stream.collect()
To get the sum of values we can use Collectors.summingInt() with Stream.collect() for integer data type.
int sum = list.stream().map(Line::getLength).collect(Collectors.summingInt(i->i));
Sum using Collectors.summarizingInt() with Stream.collect() and IntSummaryStatistics
To get the sum of values we can use Collectors.summarizingInt() with Stream.collect() and IntSummaryStatistics .
IntSummaryStatistics stats = list.stream() .collect(Collectors.summarizingInt(Line::getLength)); IntSummaryStatistics stats = list.stream().flatMap(a->Arrays.stream(a)) .collect(Collectors.summarizingInt(i->i)); System.out.println(stats.getSum());
For long data type, we use summingLong with LongSummaryStatistics and for double data type there is summingDouble with DoubleSummaryStatistics in java 8.
Here Line is our custom class.
Line.java
package com.concretepage; public class Line < private int length; public Line(int length) < this.length = length; >public int getLength() < return length; >>
Sum using Stream.reduce() with BiFunction and BinaryOperator
To get the sum of values we can use Stream.reduce() with BiFunction as accumulator and BinaryOperator as combiner in parallel processing.
int sum = list.parallelStream().reduce(0, (output, ob) -> output + ob.getLength(), (a, b) -> a + b);
Here 0 is an identity. Identity is operated using BinaryOperator to each and every element of stream. If identity is 0, then it results into the sum of elements of stream in our example.
Sum using Stream.reduce() with Custom Method
int sum = Arrays.stream(array).reduce(0, StatisticsUtility::addIntData);
package com.concretepage; public class StatisticsUtility < public static int addIntData(int num1, int num2) < return num1 + num2; >>
int sum = Arrays.stream(array).reduce(0, Integer::sum);
Sum of Array Example
package com.concretepage; import java.util.Arrays; import java.util.function.IntBinaryOperator; public class SumOfArrayDemo < public static void main(String[] args) < int[] array = ; System.out.println("--Using IntStream.sum()--"); int sum = Arrays.stream(array).sum(); System.out.println(sum); System.out.println("--Using Stream.reduce() with IntBinaryOperator--"); IntBinaryOperator ibop = (x,y) -> x+y; sum = Arrays.stream(array).reduce(0, ibop); System.out.println(sum); System.out.println("--Using Stream.reduce() with Integer.sum()--"); sum = Arrays.stream(array).reduce(0, Integer::sum); System.out.println(sum); System.out.println("--Using custom method--"); sum = Arrays.stream(array).reduce(0, StatisticsUtility::addIntData); System.out.println(sum); > >
--Using IntStream.sum()-- 251 --Using Stream.reduce() with IntBinaryOperator-- 251 --Using Stream.reduce() with Integer.sum()-- 251 --Using custom method-- 251
Sum of List Example
package com.concretepage; import java.util.ArrayList; import java.util.IntSummaryStatistics; import java.util.List; import java.util.stream.Collectors; public class SumOfListDemo < public static void main(String[] args) < List<Line> list = new ArrayList<>(); list.add(new Line(213)); list.add(new Line(233)); list.add(new Line(243)); list.add(new Line(253)); System.out.println("--Using IntStream.sum()--"); int sum = list.stream().map(Line::getLength).mapToInt(Integer::intValue).sum(); System.out.println(sum); System.out.println("--Using Collectors.summingInt()--"); sum = list.stream().map(Line::getLength).collect(Collectors.summingInt(i->i)); System.out.println(sum); System.out.println("--Using summarizingInt()--"); IntSummaryStatistics stats = list.stream() .collect(Collectors.summarizingInt(Line::getLength)); System.out.println(stats.getSum()); System.out.println("--Using Stream.reduce() with combiner--"); sum = list.parallelStream().reduce(0, (output, ob) -> output + ob.getLength(), (a, b) -> a + b); System.out.println(sum); >>
--Using IntStream.sum()-- 942 --Using Collectors.summingInt()-- 942 --Using summarizingInt()-- 942 --Using Stream.reduce() with combiner-- 942
Sum of List of Array Example
package com.concretepage; import java.util.ArrayList; import java.util.Arrays; import java.util.IntSummaryStatistics; import java.util.List; import java.util.stream.Collectors; public class SumOfListOfArrayDemo < public static void main(String[] args) < List<Integer[]> list = new ArrayList<>(); Integer[] a1 = ; list.add(a1); Integer[] a2 = ; list.add(a2); System.out.println("--Using Collectors.summingInt()--"); int sum = list.stream().flatMap(a->Arrays.stream(a)). collect(Collectors.summingInt(i->i)); System.out.println(sum); System.out.println("--Using Collectors.summarizingInt()--"); IntSummaryStatistics stats = list.stream().flatMap(a->Arrays.stream(a)) .collect(Collectors.summarizingInt(i->i)); System.out.println(stats.getSum()); System.out.println("--Using IntStream.sum()--"); sum = list.stream().flatMap(a->Arrays.stream(a)). mapToInt(Integer::intValue).sum(); System.out.println(sum); > >
--Using Collectors.summingInt()-- 81 --Using Collectors.summarizingInt()-- 81 --Using IntStream.sum()-- 81
Sum of Map Example
package com.concretepage; import java.util.HashMap; import java.util.IntSummaryStatistics; import java.util.Map; import java.util.stream.Collectors; public class SumOfMapValues < public static void main(String[] args) < Map<Integer, Integer> map = new HashMap<>(); map.put(1, 12); map.put(2, 24); map.put(3, 10); System.out.println("--Using IntStream.sum()--"); int sum = map.values().stream().mapToInt(i->i).sum(); System.out.println(sum); System.out.println("--Using BinaryOperator--"); sum = map.values().stream().reduce(0, Integer::sum); System.out.println(sum); System.out.println("--Using Collectors.summingInt()--"); sum = map.values().stream().collect(Collectors.summingInt(i->i)); System.out.println(sum); System.out.println("--Using Collectors.summarizingInt()--"); IntSummaryStatistics stats = map.values().stream().collect(Collectors.summarizingInt(i->i)); System.out.println(stats.getSum()); System.out.println("--Using custom method--"); sum = map.values().stream().reduce(0, StatisticsUtility::addIntData); System.out.println(sum); >>
--Using IntStream.sum()-- 46 --Using BinaryOperator-- 46 --Using Collectors.summingInt()-- 46 --Using Collectors.summarizingInt()-- 46 --Using custom method-- 46