java8 reduce的用法_Java 8 Stream.reduce() 使用示例

在 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

或方法引用 Integer::sum

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

Integer.java

/**

* 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()方法签名:

Stream.java

T reduce(T identity, BinaryOperator accumulator);

IntStream.java

int reduce(int identity, IntBinaryOperator op);

LongStream.java

long reduce(int identity, LongBinaryOperator op);

identity = 默认值或初始值。

BinaryOperator = 函数式接口,取两个值并产生一个新值。(注: java Function 函数中的 BinaryOperator接口用于执行 lambda 表达式并返回一个 T 类型的返回值)

1.2 如果缺少identity参数,则没有默认值或初始值,并且它返回 optional。

Stream.java

Optional reduce(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 :) (最好使用 Java 8 的 String.join)

String join = String.join("|", strings);

3. Map & Reduce

一个简单的 map 和 reduce 示例,用于从发票 List 中求 BigDecimal 的和。

JavaReduce.java

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) {

// 发票集合

List invoices = 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 使用setScale方法进行四舍五入

}

}

class Invoice {

// 发票号码

String invoiceNo;

// 价格

BigDecimal price;

// 数量

BigDecimal qty;

// getters, stters n constructor

}

输出

49.955

49.96

个人公众号《骇客与画家》,欢迎关注

%E7%A8%BF%E5%AE%9A%E8%AE%BE%E8%AE%A1%E5%AF%BC%E5%87%BA-20191207-232524.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值