美文网首页
java8实战与原理学习---stream流

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

作者: 先生zeng | 来源:发表于2020-11-30 22:36 被阅读0次

尽管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的规则是可以并行、流式处理数据流的,使用上面的方式解决,那么基于这一规则做的优化,都失去了意义。

待续。。。

相关文章

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

    尽管java8已经出来很多年了,但很多java开发甚至资深java开发程序员对于java8的使用和新增的一些设计还...

  • Java8之Stream流(六)收集

    Java8之Stream流(一)基础体验 Java8之Stream流(二)关键知识点 Java8之Stream...

  • Stream流

    Stream流 java8新特性 Stream定义 A sequence of elements supporti...

  • Java8中的并行流

    此笔记是我在阅读《Java8实战》时的一些记录。 Java8中增加了流(stream)的概念,为数据的处理带来了很...

  • Java8的stream流实现list实体拷贝

    常规写法: 使用java8的stream流的写法:

  • Stream

    使用 Stream API 高逼格 优化 Java 代码 Java8 Stream流中的 collect() 别再...

  • Java8 Stream-API

    Java8 Stream-API Stream 流类似集合类中的Iterator,但是比Iterator高级,只需...

  • [FE] 图解 RxJS 编码实践

    一、流 与 流变换 1. 流(stream) 2. 流变换(transform) 二、实战(React Hook ...

  • Java8 Stream终端操作使用详解

    前情回顾 前几篇讲了Java8中Stream流的简介,创建流的方式,以及Stream流中间操作的使用详解,想回顾的...

  • Java8 学习笔记

    @(in action系列)[java8, lambda, stream] Java8 学习 java8 能高效的...

网友评论

      本文标题:java8实战与原理学习---stream流

      本文链接:https://www.haomeiwen.com/subject/igtbvktx.html