java8流原理_java8实战与原理学习---stream流

尽管java8已经出来很多年了,但很多java开发甚至资深java开发程序员对于java8的使用和新增的一些设计还处于很简单的基础使用阶段,对于一些新特性,只会讲一些大概,理解不够深。基于此,我决定也好好重新整理一份java8的一些基础使用以及原理。

java8里面将代码传递给方法的功能(同时叶能够返回代码并包含在数据结构中)还让我们能够使用一套完整的编程新技巧,称为函数式编程。这种被函数界称为函数的代码,可以被来回传递并加以组合,以产生强大的编程词汇。

流处理

流是一系列数据项,一次只生成一项,程序可以从输入流中一个一个读取数据项,然后以同样的方式将数据写入流。一个程序的输出流很可能是另外一个程序的输入流。

举个我个人理解的简单例子:

例如我们通过命令进行一个操作:

1.读取文件A的内容到文件B

2.同时把文件A中的字符流中的大写字母转化成小写字母

3.并且进行排序,基于字符的ascll码

4.输出最后三行

在linux命令中展示出来就是这样的:

cat fileA fileB | tr "[A-Z]" "[a-z]" | sort | tail 3

cat命令会在两个文件中建立一个流,tr会把流的内容进行排序,sort会进行转换,最后tail会去最后三行输出。这类似于一个流水线的命令,但是每个流水线不一定等前一个全部执行完才进行,而是使用并行的方式去处理前一流水线的处理结果。

相信这样大家会有一点理解:

流,类似流水线一样,但是是以并行的一种方式在处理一系列数据项的。

Stream流

java8基于上面的这种思想,设计的stream也是类似的,给stream流添加了一种Stream api,你可以把他们理解成一种迭代器,但是很花哨,他们可以组合成一个很复杂的流水线处理,类似上面的linux命令一样。

这样设计的好处:

1.可以简化很多代码,同时可以基于更高的抽象层次去写java8程序了,不用每次去处理一个数据项。

2.java8的stream流还支持把不相关部分的数据流拿到几个内核去执行stream操作流水线。(大家想到了啥,对,就是并行,这样我们就不用手动去搞并行了)。

并行与共享可变的数据

前面我们说了,stream api这种设计的好处,说了第二点,相当于并行处理了。那么要使用这种并行处理,需要放弃什么呢?

其实就是需要注意对传给流的方法的行为的写法需要作一些改变,你的行为必须对不同的输入能够安全的执行。

有点抽象哈,我直接说结论,一般情况下,你写代码时就不能访问共享的可变数据。

前面已经说了,并行是基于你处理的数据流是互不相关的,你的代码的多个副本可以独立工作才可以进行的。如果你写入的是共享变量的话,那就不行了,两个进程同时要改这个内容,怎么处理呢?

(所以不要以为sream API使用很简单,用的很爽,出问题了,可能很多时候,你都不知道啥问题,可以从这方面去思考下。)

怎么解决呢?

stream只解决了并行,共享数据的修改,一看就涉及到线程安全了嘛,那解决的方式就非常多了,Asynchronized,CAS算法,原子,。。。

尽管可以使用上面的去处理这个问题,但是你要思考清楚,使用stream的意义,stream的规则是可以并行、流式处理数据流的,使用上面的方式解决,那么基于这一规则做的优化,都失去了意义。

待续。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值