微微蓝~
http://www.cnblogs.com/onlys

导航

 

 

不好意思,最近刷小视频刷的有点上头

看到这图就不自觉的要来一句:"卧槽,无情"

好了,我要开始正经了

JAVA 8 已经推出有一段时间了, 相比之前, 我们操作集合的方式应该是这样?

 

 

这样?

 

或者是这样?

        OK, 现在相信你看到这样的遍历方式可能也会吐槽一番


Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找、遍历、过滤以及常见计算等本篇只举例list和map, 为了便于理解, 我们先创建一个数据类
PS:为了解决屏幕空间, 注释不标准, 请忽略

首先我们先操作List

  1. 遍历所有人员的名字

    2.过滤年龄大于12的

    3.过滤年龄大于12的总人数

    4.根据年龄排序

     5.获得年龄最小的

 

     6.年龄最大的

      7.将所有的名字打印出来并用逗号隔开

      8.所有人年龄的总和

      9.关于统计类 IntSummaryStatistics

 

-------------我是一条红色的分界线-----------

        关于Map中Stram的操作

        1.list转map

        2.在转换过程中, key重复的情况的处理方式

(key1,key2) -> key2是一种表达式, 表示转换map时,如果有两个相同的key,

则取后面的key2替换前面的key1,key1,key2两个关键字可以随意修改.

        3.key重复时,将前面的value和后面的value相加

 

 小结: 

        先说下Stream的优势:它是java对集合操作的优化,相较于迭代器,使用Stream的速度非常快,并且它支持并行方式处理集合中的数据,默认情况能充分利用cpu的资源。同时支持函数式编程,代码非常简洁。

 

  Stream是一种用来计算数据的流,它本身并没有存储数据。你可以认为它是对数据源的一个映射或者视图。

 

  它的工作流程是:获取数据源->进行一次或多次逻辑转换操作->进行归约操作形成新的流(最后可以将流转换成集合)。

        

Stream的特性

        1.中间操作惰性执行:一个流后面可以跟随0到多个中间操作,主要目的是打开流,并没有真正的去计算,而是做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历,并没有消耗资源。

还有多个中间操作的话,这里的时间复杂度并不是n个for循环,转换操作都是 lazy 的,多个转换操作只会在 Terminal 操作的时候融合起来,一次循环完成。可以这样简单的理解,Stream 里有个操作函数的集合,每次转换操作就是把转换函数放入这个集合中,在Terminal操作的时候循环 Stream 对应的集合,然后对每个元素执行所有的函数。

      2.流的末端操作只能有一次:当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。之后如果想要操作就必须新打开流。

 

关于流被关闭不能再操作的异常:

 

这里曾经遇到过一个错误:stream has already been operated upon or closed

 

意思是流已经被关闭了,这是因为当我们使用末端操作之后,流就被关闭了,无法再次被调用,如果我们想重复调用,只能重新打开一个新的流.



OK, 到此, 本文暂时告一段落, 之后的代码中会大量体现stream和lambda表达式的代码, 希望大家持续关注
下一篇, 将给大家带来一个福利插件, 希望关注

原创:微微蓝



想要提升自己,工作中遇到的问题,更多JAVA技术相关文章,微信扫一扫关注作者公众号

posted on 2019-10-28 17:20  微微蓝  阅读(542)  评论(2编辑  收藏  举报