Java 8 Stream.reduce()方法介绍

x33g5p2x  于2022-09-17 转载在 Java  
字(1.4k)|赞(0)|评价(0)|浏览(1304)

Reduce是一种函数式编程技术,它合并数值并返回一个值。让我们来学习了解如何在java 8中使用流式Reduce函数。

入门

Reduce,又称折叠、聚合或折叠,是java 8的一个流方法,它将一个函数应用于流中的元素,然后返回一个值。常见的例子包括求和、最小、最大、平均和字符串连接。让我们来看reduce的基本原理。

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",是下一个要处理或添加的整数。

让我们以表格的形式来看看通过累加器处理的内容。

ab返回值
第一次调用011
第二次调用123
第三次调用336
第四次调用6410
第五次调用10515

BinaryOperator来代替lambda

如果你想在很多地方重复使用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);
}

感谢阅读。

相关文章

最新文章

更多