Reduce是一种函数式编程技术,它合并数值并返回一个值。让我们来学习了解如何在java 8中使用流式Reduce函数。
Reduce,又称折叠、聚合或折叠,是java 8的一个流方法,它将一个函数应用于流中的元素,然后返回一个值。常见的例子包括求和、最小、最大、平均和字符串连接。让我们来看reduce的基本原理。
下面的代码片断将对流的值进行求和。
@Test
public void reduce_java8_lambda() {
List<Integer> myList = Arrays.asList(1, 2, 3, 4, 5);
double sum = myList.stream().reduce(0, (a, b) -> a + b);
// or myList.stream().reduce(0, Integer::sum);
System.out.println(sum); //15.0
}
传递给reduce的第一个元素是0。0代表身份或者reduction的初始值,如果流中没有元素,则是默认结果。在这个例子中,由于Integer
包含整数,所以身份必须是e1d0d1e类型。如果标识以2开始,那么和就是17.0。
第二个参数是代表累加器或函数(a, b) -> a + b
的lambda表达式。分解这个无状态函数,"a "代表减少的部分结果或所有处理的数字的总和。第二部分,"b",是下一个要处理或添加的整数。
让我们以表格的形式来看看通过累加器处理的内容。
a | b | 返回值 | |
---|---|---|---|
第一次调用 | 0 | 1 | 1 |
第二次调用 | 1 | 2 | 3 |
第三次调用 | 3 | 3 | 6 |
第四次调用 | 6 | 4 | 10 |
第五次调用 | 10 | 5 | 15 |
如果你想在很多地方重复使用Reduce函数,你可以重构上面的例子,使用BinaryOperator
。一个BinaryOperator
是一个@FunctionalInterface
,将对两个值执行操作。
@Test
public void reduce_java8_binaryOperator() {
List<Integer> myList = Arrays.asList(1, 2, 3, 4, 5);
BinaryOperator<Integer> sum3 = (a, b) -> a + b;
double sum = myList.stream().reduce(2, sum3);
System.out.println(sum); // 17
}
###更便捷的方法
Java 8 引入了一种特殊类型的流来处理它们各自的数据类型。 IntStream、DoubleStream 和 LongStream 带有简化的便利方法。重写上面的示例看起来会有些不同,但会执行相同的行为。
将列表转换为流,然后将每个值映射为原始int,将返回一个IntStream
。调用 sum
函数将减少返回 15 的流。
@Test
public void reduce_java8_a() {
List<Integer> myList = Arrays.asList(1, 2, 3, 4, 5);
int sum = myList.stream().mapToInt(Integer::intValue).sum();
System.out.println(sum);
}
感谢阅读。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : http://www.leveluplunch.com/java/tutorials/041-java8-stream-reduce/
内容来源于网络,如有侵权,请联系作者删除!