方法名 | 描述 |
---|---|
reduce(T iden, BinaryOperator b) | 可以将流中元素反复结合起来,得到一个值。返回T |
reduce(BinaryOperator b) | 可以将流中元素反复结合起来,得到一个值。返回Optional |
备注:map 和reduce 的连接通常称为map-reduce 模式,因Google 用它来进行网络搜索而出名。
测试代码
TestReduce.java
package java8.reduce;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import org.junit.Test;
/**
* @author 微信公众号:JavaWeb架构师
* @version 创建时间:2017年12月29日 上午9:54:15
*/
public class TestReduce {
private List<Integer> listInteger = Arrays.asList(1,2,-1,-2,-3,10,11,50,-50);
/**
* 1.规约
* reduce(T iden, BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。返回T
* reduce(BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。返回Optional<T>
*/
// 1.reduce(T iden, BinaryOperator b):起始值为iden,累计的做b操作
@Test
public void test1() {
/**
* T reduce(T identity,BinaryOperator<T> accumulator):
* 使用提供的身份值和associative累积功能对此流的元素执行reduction ,
* 并返回减小的值。
* 这是一个terminal operation 。
* API Note:
* 总和,最小,最大,平均和字符串连接都是减少的特殊情况。 一个数字流可以表示为:
* Integer sum = integers.reduce(0, (a, b) -> a+b); 要么:
* Integer sum = integers.reduce(0, Integer::sum); 尽管与简单地将循环
* 中的总体变量相比,这可能看起来更为迂回的方式进行,但减少操作更平稳地并行化,
* 而不需要额外的同步,并大大降低了数据竞争的风险。
* 参数
* identity - 累积函数的身份值
* accumulator -一个 associative , non-interfering , stateless功能组合两个值
*/
// 计算集合中所有元素的总和(0与第一个元素相加得结果s1,s1再与第二个元素相加得结果s2,……)
Integer sum = listInteger.stream().reduce(0,(a,b) -> a+b);
System.out.println("总和是:" + sum);
/*
* 结果:
* 总和是:18
*/
}
// reduce(BinaryOperator b):可以将流中元素反复结合起来,得到一个值。返回Optional<T>
@Test
public void test2() {
/**
* Optional<T> reduce(BinaryOperator<T> accumulator):
* 使用associative累积函数对此流的元素执行reduction ,并返回描述减小值(如果有的话)
* 这是一个terminal operation 。
* 参数
* accumulator -一个 associative , non-interfering , stateless功能组合两个值
* 结果
* 一个Optional描述了减少的结果
*/
// 计算集合中所有元素的总和(第一个元素与第二个元素相加得结果s1,……)
Optional<Integer> reduce = listInteger.stream().reduce(Integer::sum);
System.out.println("总和是:" + reduce.get());
/*
* 结果:
* 总和是:18
*/
}
}
其它
- 源码下载
关注下方公众号,回复:Java8.code
欢迎加入交流群:451826376
更多信息:www.itcourse.top