浅谈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库中的重要部分,以上是部分理解,以后慢慢完善。