- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
项目中的需求
【需求】 : 现有学生成绩表(学号、课程名称、成绩) 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开发的我们叫做【申明式开发(函数式开发)】
一个流式处理可以分成三部分: 【流(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() |
近期评论