浅谈Streams,什么是Stream。

  直译过来的字面意思是“流”,它不同于java的InputStream和OutputStream,这是两个完全不同的概念。

Java 8中的Stream其实是函数式编程里Monad的概念(Monad的概念可以参考:

  http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html#monads)。

Monad就是一种设计模式,表示将一个运算过程,通过函数拆解成互相连接的多个步骤,有点链式操作的感觉。

它将计算过程封装到流程里面,而这个过程就用链式调用来实现,如下例子:

 

// 我们以前遍历数据使用这种显示的方法
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); 2 int sum = 0; 3 for (int n : numbers) { 4 if (n % 2 == 1) { 5 int square = n * n; 6 sum = sum + square; 7 } 8 } 9 System.out.println(sum);
1 //stream则用这种链调用,内部循环方式
2 List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
3     int sum = numbers.stream()
4         .filter(n -> n % 2  == 1)
5         .map(n  -> n * n)
6         .reduce(0, Integer::sum);
7     System.out.println(sum);

更深层理解一下上面code,其实是stream是一个 数据值的序列,支持并行和聚合操作(aggregate operations.)。我们经常在SQL中使用聚合函数。

聚合操作作用在一个项目(或者是一个数据对象)的列上并返回一个单独的值。Stream的聚合操作的结果可以是原始值,一个对象,或者是一个void的流。像SQL一样,我们可以计算整数流中所有整数的和。

  看起来貌似它和集合差不多,其实还是不同的,两者的比较如下:

  Java集合关注如何存储数据元素以实现高效访问。
  Java流致力于对来自数据源的数据元素的聚合操作。

描绘一下Stream的特点:

 一.No Storage(没有存储)

  没有存储空间。按需从数据源提取元素,并将它们传递到操作管道进行处理。

 二.Infinite Streams无限流

  集合不能表示一组无限的元素,而Stream可以。Stream可以从数据源中提取元素。数据源可以是集合,生成数据的功能,I / O通道等。

  Stream可以从生成无限数量元素的函数中提取数据。

 三.Not Reusable不可重复用

  在重用的情况下,Stream可能抛出IllegalStateException。

其实Stream还有许多内容,他是java的jdk库中的重要部分,以上是部分理解,以后慢慢完善。

posted @ 2020-07-16 15:03  狗艳艳花  阅读(1109)  评论(0编辑  收藏  举报