Java8的流式编程-“花哨的iterator”

247次阅读
一条评论
Java8的流式编程-“花哨的iterator”

Java不知不觉已经出到了14了,如果再对Java8的“新”特性敬而远之就有点说不过去了,就像是在微信横行的年代仍然使用短信一样,所以最近赶紧用起了流式编程,感觉就两个字“真香”。

流式编程的核心就是操作流,这个流可以自己生成:

Stream.builder()

但是更多的是从集合中去生成

new ArrayList<Activity>.stream()

既然已经拿到了流 那就要对流进行操作了 对流的操作就有很多了 map(),distinct(),sorted(),foreach(),collect().....其中很多操作都是可以顾名思义的 但是还有一些是不能的 比如reduce()或者上面的map(),这里就不说这些函数具体的功能再拾人牙慧了,其他人已经说的很详尽了,大家可以搜搜看,总之就是通过对流的操作,从而操作集合。

流式编程的操作从执行的顺序上分为两种,中间操作( filter ,limit,sort,map,distinct。。。)和最终操作(reduce foreach collect close allmatch anymatch。。。)从属于中间操作的那些操作,不是顺序执行的,而是等到最终操作要执行的时候,在最终操作执行前进行执行,这也是我的一个朋友的断点打在中间操作的函数上不起作用的原因。

Java8的流式编程-“花哨的iterator”

怎么判断一个操作是中间操作还是最终操作呢?其实很简单,看返回值就可以了 ,凡是返回Stream的 基本都是中间操作,既然如此,那么中间操作就可以连起来形成了pipeline,而且中间操作上面也提到了 都是lazy的加载形式,这种方式更加有利于像延迟加载,短路,循环合并等操作。

而最终操作基本是将经过中间操作处理过后的Stream进行处理,或是聚合成list 或是返回Integer 也可能是void这种,而且最终操作之所以是最终,就是因为他操作之后调用了Runnble 进行关流,流中所有数据都会被销毁

说到这里为止,其实流的操作都可以被Iterator所代替 ,但是如果真的是这样那么流也就没有什么存在必要了,在我看来,流相对于迭代器的优势在于他的并行-Parallel Streams ,我们可以让流自己进行并行控制,而不用我们自己进行操作线程,这样就减少了很多很多的代码工作量,并且在绝大多数情况下,parallelStream应该也比自己操作线程效率要高的。但是也有不少的特殊情况,使用并行流反而会效率更低 ,这些情况基本上都是因为数据结构/装箱拆箱的难易程度/数据量的多少等等。

https://zhuanlan.zhihu.com/p/21394743

更深度的内容这篇博客讲的很好哦↓

https://www.cnblogs.com/CarpenterLee/p/6550212.html

评论(一条评论)
2020-12-10 08:05:52 回复

I conceive you have noted some very interesting points, regards for the post. Sybila Magnum Lindberg