Рубрики
Без рубрики

Подведение итогов с Java потоками

Краткое и практическое руководство по подведению итогов с помощью JAVA Stream API.

Автор оригинала: baeldung.

1. Введение

В этом быстром учебнике мы покажем различные способы расчет суммы цен, с помощью Поток API .

Для простоты, мы будем использовать integers в наших примерах. Тем не менее, мы можем применить те же методы для лонгов и удваивается, а также.

Дальнейшее чтение:

Введение в Java 8 Потоки

Руководство по Stream.reduce()

Руководство для коллекционеров Java 8

2. Использование Stream.reduce()

Stream.reduce () является терминальной операцией, которая выполняет уменьшение элементов потока .

Он применяет двоичного оператора (аккумулятора) к каждому элементу потока, где первым оператором является значение возврата предыдущего приложения, а вторым — текущий элемент потока.

В первом методе использования уменьшить () метод, функция аккумулятора является выражением лямбды, которое добавляет два Интегер ценностей и возвращает Интегер ценность:

List integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
  .reduce(0, (a, b) -> a + b);

Таким же образом, мы можем использовать уже существующий метод Java :

List integers = 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;
    }
}

Затем мы можем передать эту функцию в качестве параметра уменьшить () метод:

List integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
  .reduce(0, ArithmeticUtils::add);

3. Использование Stream.collect()

Второй метод расчета суммы списка цен на интеграторы заключается в использовании собирать () эксплуатация терминала:

List integers = 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 объект .

Этот метод принимает картограф в качестве параметра, который он использует для преобразования, то, мы можем назвать сумма () метод расчета суммы элементов потока.

Давайте посмотрим быстрый пример того, как мы можем использовать его:

List integers = 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 .