Java8新特性之Stream流(三)缩减操作

和前面两篇文章一起服用,效果会更佳。通过对流API的基础体验Demo和关键知识点的讲解,相信大家对流API都有一定的认识了,但是流API强大的功能,可不仅仅像前面两篇文章中说的那样简单,大家应该注意到,在第二篇中,我对Stream接口进行介绍的时候,并没有把他的全部方法都进行了解析说明。没错,从这一篇开始,那些还没有讲解的方法,很可能就开始变成我们的主角了,大家从题目上面应该知道了,本期我们要讲的是流API的缩减操作。

何为缩减操作?

缩减操作的三个约束

  • 无状态

  • 不干预

  • 关联性

无状态,这里可不是LOL的那个无状态,毕竟他退役了。相信读过第二篇文章的同学已经很容易理解了,简单来说无状态就是每个元素都被单独地处理,他和流中的其它元素是没有任何依赖关系的。不干预是指操作数不会改变数据源。最后,操作必须具有关联性,这里的关联性是指标准的数学含义,即,给定一个关联运算符,在一系列操作中使用该运算符,先处理哪一对操作数是无关紧要的。比如,(1 2) 3 <===> 1 (2 3)。其中关联性,在并行流中,是至关重要的。下面我用一个简单的例子带着大家实战一下泛化缩减操作reduce()的使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Main {

   public static void main(String[] args) {
       learnStream();
   }


   private static void learnStream() {
       List<Integer> lists = new ArrayList<>();
       lists.add(1);
       lists.add(2);
       lists.add(3);
       lists.add(4);
       lists.add(5);
       lists.add(6);

       Optional<Integer> sum = lists.stream().reduce((a, b) -> a + b);
       if (sum.isPresent()) System.out.println("list的总和为:" + sum.get());//21
       //<====> lists.stream().reduce((a, b) -> a + b).ifPresent(System.out::println);

       Integer sum2 = lists.stream().reduce(0, (a, b) -> a + b);//21
       System.out.println("list的总和为:" + sum2);

       Optional<Integer> product = lists.stream().reduce((a, b) -> a * b);
       if (product.isPresent()) System.out.println("list的积为:" + product.get());//720

       Integer product2 = lists.stream().reduce(1, (a, b) -> a * b);
       System.out.println("list的积为:" + product2);//720
   }
}

这个Demo主要是计算了一个list里面的总和,积的操作,大家可以和传统的算总和,积的方法进行对照,比一比衡量一下就有自己的答案了。但是如果你以为流API仅此而已,那你就错了。越是后面的东西,就越装B,我在刚知道他们的时候,反正是被吓了一跳的,但这些都是后话了,现在我们来详解一下Demo,并给出扩展的方向:我们这个例子主要是用了lambda表达式对list进行了求和,求积,对于第一个版本为说,求和的时候,identity的值为0,求积的时候它的值为1,强烈建议你们自己感受一下identity的变化对整个结果的变化产生什么 的影响,改变一下identity的值,再运行一下,你就有结果了,另一个扩展点是:

1
2
3
4
Integer product3 = lists.stream().reduce(1, (a, b) -> {
          if (b % 2 == 0) return a * b; else return a;//这里你可以为所欲为!
});
System.out.println("list的偶数的积为:" + product3);//48

小结一下

对于流的缩减操作来说,主要要知道,他只返回一个值,并且它是一个终端操作,然后还有的就是要知道缩减操作的三个约束了,其实最重要的就是无状态性和关联性了.这一小节要说的,也就这么多了,应该很容易就把他收到自己的技能树上面了。


发布于 2020-04-01 21:09:36
分享
海报
176
上一篇:Java8新特性之Stream流(四)并行流 下一篇:Java8新特性之Stream流(二)关键知识点
目录

    推荐阅读

    忘记密码?

    图形验证码