【视频&交流平台】
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的使用。