1 Stream的介绍
1.1 概念
stream流操作是Java 8提供一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要改进了对集合类的 API和新增Stream操作。Stream类中每一个方法都对应集合上的一种操作。将真正的函数式编程引入到Java中,能让代码更加简洁,极大地简化了集合的处理操作,提高了开发的效率和生产力。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器等。在Stream中的操作每一次都会产生新的流,内部不会像普通集合操作一样立刻获取值,而是 惰性取值 ,只有等到用户真正需要结果的时候才会执行。 并且对于现在调用的方法,本身都是一种高层次构件,与线程模型无关。因此在并行使用中无需再去操心线程和锁。Stream内部都已经做好了 。
1.2 原理
可以把Stream流当成工厂中的流水线,每个stream流的操作过程遵循着创建 -->操作 -->获取结果的过程,
可以把他理解成sql的视图,集合就相当于数据表中的数据,获取stream流的过程就是确定数据表的属性和元数据的过程,对stream流进行操作的过程就是通过sql对这些数据进行查找、过滤、组合、计算、操作、分组等过程,获取结果就是sql执行完毕之后获取的结果视图一样
1.3 特点
-
Stream可以由数组或集合创建,对流的操作分为两种:
- 中间操作,每次返回一个新的流,可以有多个
- 终端操作,每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合或值
-
特点:
- stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果
- stream不会改变数据源,通常情况下会产生一个新的集合或一个值。
- stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。
2 Stream的创建
2.1 集合创建
通过java.util.Collection.stream()
方法用集合创建流
@Testpublic void m1(){List<String> list = new ArrayList<>();list.add("AAA");//创建stream顺序流对象Stream<String> stream1 = list.stream();//创建stream顺序流对象Stream<String> stream2 = list.parallelStream();System.out.println(stream1);System.out.println(stream2);}
2.2 数组创建
使用java.util.Arrays.stream(T[] array)
方法用数组创建流
@Testpublic void m2(){String[] arrStr = {"AAA","BBB","CCC"};Stream<String> stream = Arrays.stream(arrStr);}
2.3 静态方法创建
使用Stream的静态方法:of()、iterate()、generate()