В Java 8 функция Stream.reduce()
объединяет элементы потока и выдает одно значение.
Простая операция суммирования с использованием цикла for.
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int sum = 0; for (int i : numbers) { sum += i; } System.out.println("sum : " + sum); // 55
Эквивалент в Stream.reduce()
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 1st argument, init value = 0 int sum = Arrays.stream(numbers).reduce(0, (a, b) -> a + b); System.out.println("sum : " + sum); // 55
или ссылка на метод с Целым числом::сумма
int sum = Arrays.stream(numbers).reduce(0, Integer::sum); // 55
/** * Adds two integers together as per the + operator. * * @param a the first operand * @param b the second operand * @return the sum of {@code a} and {@code b} * @see java.util.function.BinaryOperator * @since 1.8 */ public static int sum(int a, int b) { return a + b; }
1. Сигнатура метода
1.1 Просмотрите сигнатуру метода Stream.reduce()
:
T reduce(T identity, BinaryOperatoraccumulator);
int reduce(int identity, IntBinaryOperator op);
long reduce(int identity, LongBinaryOperator op);
- идентичность или начальное значение.
- Интерфейс двоичного оператора, принимает два значения и выдает новое значение.
1.2 если аргумент identity
отсутствует, нет значения по умолчанию или начального значения, и он возвращает необязательное значение.
Optionalreduce(BinaryOperator accumulator);
2. Больше Примеров
2.1 Математические операции.
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int sum = Arrays.stream(numbers).reduce(0, (a, b) -> a + b); // 55 int sum2 = Arrays.stream(numbers).reduce(0, Integer::sum); // 55 int sum3 = Arrays.stream(numbers).reduce(0, (a, b) -> a - b); // -55 int sum4 = Arrays.stream(numbers).reduce(0, (a, b) -> a * b); // 0, initial is 0, 0 * whatever = 0 int sum5 = Arrays.stream(numbers).reduce(0, (a, b) -> a / b); // 0
2.2 Макс. и мин.
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int max = Arrays.stream(numbers).reduce(0, (a, b) -> a > b ? a : b); // 10 int max1 = Arrays.stream(numbers).reduce(0, Integer::max); // 10 int min = Arrays.stream(numbers).reduce(0, (a, b) -> a < b ? a : b); // 0 int min1 = Arrays.stream(numbers).reduce(0, Integer::min); // 0
2.3 Строка соединения.
String[] strings = {"a", "b", "c", "d", "e"}; // |a|b|c|d|e , the initial | join is not what we want String reduce = Arrays.stream(strings).reduce("", (a, b) -> a + "|" + b); // a|b|c|d|e, filter the initial "" empty string String reduce2 = Arrays.stream(strings).reduce("", (a, b) -> { if (!"".equals(a)) { return a + "|" + b; } else { return b; } }); // a|b|c|d|e , better uses the Java 8 String.join :) String join = String.join("|", strings);
3. Карта и сокращение
Простая карта и сведите пример к сумме BigDecimal
из списка счетов-фактур.
package com.mkyong; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Arrays; import java.util.List; public class JavaReduce { public static void main(String[] args) { Listinvoices = Arrays.asList( new Invoice("A01", BigDecimal.valueOf(9.99), BigDecimal.valueOf(1)), new Invoice("A02", BigDecimal.valueOf(19.99), BigDecimal.valueOf(1.5)), new Invoice("A03", BigDecimal.valueOf(4.99), BigDecimal.valueOf(2)) ); BigDecimal sum = invoices.stream() .map(x -> x.getQty().multiply(x.getPrice())) // map .reduce(BigDecimal.ZERO, BigDecimal::add); // reduce System.out.println(sum); // 49.955 System.out.println(sum.setScale(2, RoundingMode.HALF_UP)); // 49.96 } } class Invoice { String invoiceNo; BigDecimal price; BigDecimal qty; // getters, stters n constructor }
Выход
49.955 49.96
Рекомендации
- Сокращение JavaDoc
- Двоичный оператор JavaDoc
- Java – Как соединить строку списка запятыми
- Пример Java 8–StringJoiner
Оригинал: “https://mkyong.com/java8/java-8-stream-reduce-examples/”