JAVA8 新特性-stream

看到同事写的代码,一脸懵

String[] ids = new String[2];
        ids = tasksEntities.stream().map(Tasks::getTaskID).collect(Collectors.toList()).toArray(ids);

 

一.stream(流)

优点:1.无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组、JAVA容器或者I/O channel等。

           2.为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。

           3.惰性执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。

           4.可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。

操作类型:

第一种:Intermediate

              一个流可以后面跟随0个或者N个intermediate操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。

第二种:Terminal

              一个流只能有一个terminal操作,当这个操作执行后,流就被使用“光”了,无法再被操作,所以这必定是流的最后一个操作。Terminal操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个side effect。

 

在对于一个 Stream 进行多次转换操作 (Intermediate 操作),每次都对 Stream 的每个元素进行转换,而且是执行多次,这样时间复杂度就是 N(转换次数)个 for 循环里把所有操作都做掉的总和吗?其实不是这样的,转换操作都是 lazy 的,多个转换操作只会在 Terminal 操作的时候融合起来,一次循环完成。我们可以这样简单的理解,Stream 里有个操作函数的集合,每次转换操作就是把转换函数放入这个集合中,在 Terminal 操作的时候循环 Stream 对应的集合,然后对每个元素执行所有的函数。

 

还有一种操作被称为 short-circuiting。用以指:

          对于一个 intermediate 操作,如果它接受的是一个无限大(infinite/unbounded)的 Stream,但返回一个有限的新 Stream。
          对于一个 terminal 操作,如果它接受的是一个无限大的 Stream,但能在有限的时间计算出结果。

 

使用:

        简单说,对 Stream 的使用就是实现一个 filter-map-reduce 过程,产生一个最终结果,或者导致一个副作用(side effect)

        

操作:

 

Intermediate:
    
              map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered

Terminal:
    
             forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator


short-circuiting:
    
            anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit

 

map 生成的是个 1:1 映射,每个输入元素,都按照规则转换成为另外一个元素。

 

 

转自:https://blog.csdn.net/lidai352710967/article/details/82496783

           https://blog.csdn.net/Ideality_hunter/article/details/83031100

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值