不好意思, 最近刷小视频刷的有点上头
看到这图就不自觉的要来一句:"卧槽, 无情"
好了, 我要开始正经了
JAVA 8 已经推出有一段时间了, 相比之前, 我们操作集合的方式应该是这样?
这样?
或者是这样?
OK, 现在相信你看到这样的遍历方式可能也会吐槽一番
Stream 是用函数式编程方式在集合类上进行复杂操作的工具, 其集成了 Java 8 中的众多新特性之一的聚合操作, 开发者可以更容易地使用 Lambda 表达式, 并且更方便地实现对集合的查找, 遍历, 过滤以及常见计算等本篇只举例 list 和 map, 为了便于理解, 我们先创建一个数据类
PS: 为了解决屏幕空间, 注释不标准, 请忽略
首先我们先操作 List
遍历所有人员的名字
2. 过滤年龄大于 12 的
3. 过滤年龄大于 12 的总人数
4. 根据年龄排序
5. 获得年龄最小的
6. 年龄最大的
7. 将所有的名字打印出来并用逗号隔开
8. 所有人年龄的总和
9. 关于统计类 IntSummaryStatistics
------------- 我是一条红色的分界线 -----------
关于 Map 中 Stram 的操作
1.list 转 map
2. 在转换过程中, key 重复的情况的处理方式
(key1,key2) -> key2 是一种表达式, 表示转换 map 时, 如果有两个相同的 key,
则取后面的 key2 替换前面的 key1,key1,key2 两个关键字可以随意修改.
3.key 重复时, 将前面的 value 和后面的 value 相加
小结:
先说下 Stream 的优势: 它是 java 对集合操作的优化, 相较于迭代器, 使用 Stream 的速度非常快, 并且它支持并行方式处理集合中的数据, 默认情况能充分利用 CPU 的资源. 同时支持函数式编程, 代码非常简洁.
Stream 是一种用来计算数据的流, 它本身并没有存储数据. 你可以认为它是对数据源的一个映射或者视图.
它的工作流程是: 获取数据源 -> 进行一次或多次逻辑转换操作 -> 进行归约操作形成新的流 (最后可以将流转换成集合).
Stream 的特性
1. 中间操作惰性执行: 一个流后面可以跟随 0 到多个中间操作, 主要目的是打开流, 并没有真正的去计算, 而是做出某种程度的数据映射 / 过滤, 然后返回一个新的流, 交给下一个操作使用. 这类操作都是惰性化的 (lazy), 就是说, 仅仅调用到这类方法, 并没有真正开始流的遍历, 并没有消耗资源.
还有多个中间操作的话, 这里的时间复杂度并不是 n 个 for 循环, 转换操作都是 lazy 的, 多个转换操作只会在 Terminal 操作的时候融合起来, 一次循环完成. 可以这样简单的理解, Stream 里有个操作函数的集合, 每次转换操作就是把转换函数放入这个集合中, 在 Terminal 操作的时候循环 Stream 对应的集合, 然后对每个元素执行所有的函数.
2. 流的末端操作只能有一次: 当这个操作执行后, 流就被使用 "光" 了, 无法再被操作. 所以这必定是流的最后一个操作. 之后如果想要操作就必须新打开流.
关于流被关闭不能再操作的异常:
这里曾经遇到过一个错误: stream has already been operated upon or closed
意思是流已经被关闭了, 这是因为当我们使用末端操作之后, 流就被关闭了, 无法再次被调用, 如果我们想重复调用, 只能重新打开一个新的流.
OK, 到此, 本文暂时告一段落, 之后的代码中会大量体现 stream 和 lambda 表达式的代码, 希望大家持续关注
下一篇, 将给大家带来一个福利插件, 希望关注
原创: 微微蓝
来源: https://www.cnblogs.com/onlys/p/11753676.html