Stream你又知道多少呢项目中的需求Stream定义

项目中的需求

【需求】 : 现有学生成绩表(学号、课程名称、成绩) 1、需要删选除成绩高于85分的数据,并且按照成绩从高到低排序 2、获取成绩最高分的学号 3、按课程分组求平均分 假设现查出的上述数据放在scoreList中。 List<Score> scoreList = new ArrayList<>();

Java7之前的做法

其实上面的需求很简单。稍微懂点代码的都应该能实现这个功能。今天我们强调的不是实现,而是实现的方式。所谓条条大路通罗马。我们今天将通过Java8新特性stream的方式实现。首先我们先来看看Java7甚至之前的实现方法。

  • 题一代码&效果 题一代码 题一效果
  • 题二代码&效果 题二代码 题一效果
  • 题三代码&效果 题三代码 题一效果

不说了真的Java7甚至之前对于这种需求我们真的很想吐,这类需求属于是数据库型需求,为什么这么说呢因为这些需求我们如果放在sql中做的话那会很方便的。但是放在Java中操作数据就会麻烦。那么我们看看Java8是如何优化的。

Java8的做法

代码 效果

没有对比就没有伤害,没有stream的时代我们是多么的心酸,有了stream我们在面对数据库型需求我们就迎刃而解了。、

Stream定义

流操作被划分为中间和终端操作,并组合成流管道。一条Stream管道由一个源(如一个集合、一个数组、一个生成器函数或一个i/o通道)组成;

Java8之前我们的开发叫做【命令式编程】。Java8之后通过stream开发的我们叫做【申明式开发(函数式开发)】

001.png

一个流式处理可以分成三部分: 【流(Head)】、【中间操作(StatefulOp(有状态)|StatelessOp(无状态))】、【终端操作】。一个流的中间操作是

  • 惰性的它只有等到终端操作的时候才开始工作。
  • 执行中间操作只是产生一条新流
  • 执行完终端操作流就被销毁了。不能再被使用
  • iterator、spliterator这两个相当于是扩展接口,在stream提供的功能不满足需求的情况时,我们在通过这两个接口进行【命令式开发】
  • 在无限流作为源的情况下,通过某个中间操作(filter)产生一个有限流,这就叫短路

下面这张表格详细列出那些API是中间操作、那些是结束操作

Stream操作分类
中间操作 无状态 unordered() filter() map() mapToInt() mapToLong() mapToDouble() flatMap() flatMapToInt() flatMapToLong() flatMapToDouble() peek()
有状态 distinct() sorted() sorted() limit() skip()
结束操作 非短路操作 forEach() forEachOrdered() toArray() reduce() collect() max() min() count()
短路操作 anyMatch() allMatch() noneMatch() findFirst() findAny()