Java8新特性:Stream:基础篇_Stream

【视频&交流平台】

SpringBoot视频:http://t.cn/R3QepWG

Spring Cloud视频:http://t.cn/R3QeRZc

SpringBoot Shiro视频:http://t.cn/R3QDMbh

SpringBoot交流平台:http://t.cn/R3QDhU0

SpringBoot 2.0 SpringData和JPA视频:

http://t.cn/R1pSojf

 

说明

(1)JDK版本:1.8.0_162

 

需求缘起:

       Spring Boot 2.0有很多新的特性,但是这些特性是依赖JDK的版本是jdk 8+才能进行使用的,因此我们有必要先了解下Java8的新特性。通过前一篇文章我们了解了方法引用,进一步简化了Lambda表达式的写法,本节的我们要介绍下Stream。

 

一、什么是Stream?

Stream(流)是一个来自数据源的元素队列并支持聚合操作

(1)元素是特定类型的对象,形成一个队列。Java中的Stream并不会存储元素,而是按需计算。

(2)数据源:流的来源。 可以是集合,数组,I/Ochannel, 产生器generator 等。

(3) 聚合操作 类似SQL语句一样的操作,比如filter, map, reduce, find, match, sorted等。

和以前的Collection操作不同, Stream操作还有两个基础的特征:

(1)Pipelining: 中间操作都会返回流对象本身。这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。

(2)内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

 

二、为什么要使用Stream

Stream是Java8的一大亮点,是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的 聚合操作(aggregate operation)或者大批量数据操作。StreamAPI借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。同时,它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。所以说,Java8中首次出现的java.util.stream是一个函数式语言+多核时代综合影响的产物。

 

三、流的分类

在 Java 8 中, 集合接口有两个方法来串行流和并行流:

(1)stream()− 为集合创建串行流。

(2)parallelStream() − 为集合创建并行流。(parallel:并行)

 

3.1 stream()生成串行流:

       对于一个集合对象,只要调用该对象的实例方法stream()就可以创建一个串行流,如下示例:

List<String> strings = Arrays.asList("悟空","","唐僧","八戒","悟净","白龙马");

Stream<String> stream = strings.stream();

       有了这个stream就可以调用流的API方法了,这个我们在之后再进行讲解。

 

3.2 parallelStream()生成并行流:

       对于一个集合对象,只要调用该对象的实例方法parallelStream()就可以创建一个并行流,如下示例:

List<String> strings = Arrays.asList("悟空","","唐僧","八戒","悟净","白龙马");

Stream<String> parallelStream = strings.parallelStream();

 

四、流的创建

       对于流的创建常用的有3中方式:

(1)使用Stream对象的of()方法进行创建。

(2)Arrays的stream()方法。

(3)集合的stream()方法。

       如下示例:

//Stream.of()

Stream<String> stream = Stream.of("悟空","唐僧","八戒","悟净","白龙马");



//Arrays.

String [] strArray = new String[] {"悟空","唐僧","八戒","悟净","白龙马"};

stream = Stream.of(strArray);

stream = Arrays.stream(strArray);



//Conllections.

List<String> list = Arrays.asList("悟空","唐僧","八戒","悟净","白龙马");

stream = list.stream();

 

五、其它

5.1Stream说明

       对于Stream理解注意点:

(1)Stream 自己不会存储元素。

(2)Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。

(3)Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

 

5.2 什么是聚合操作

       对于玩过数据库的小伙伴而言的会很好的理解,比如我们在数据库常用的求和SUM、求平均值AVG、求个数COUNT、最大值最小值MAX/ MIN等,诸如下面的需求:

(1)该学生所有科目的总分;

(2)该班级数学的平均分;

(3)该班级每天的出勤人数;

(4)求该班级数学科目的最高分和最低分;

       好了,本篇文章就介绍到这里,下篇文章会使用实例进一步说明Stream的使用。