看完了 lambda
,是时候了解下 stream
了。到这里,我们的第二位主角终于登场了。Java8 推出这个极具实用性的 stream
。
黄四郎:Stream,Java8 用的 stream。Stream,You know?
马邦德:Stream,流,文件操作用的!
黄四郎:你看看这位师爷就是装糊涂的高手,Stream,说成操作文件的,那 IO 是什么?
马邦德:流,Java8 stream,提供集合便捷操作的。
未见其貌,先闻其声
让我们先从一个小例子入手:将 List<Integer> 转为 List<String>。
Java8 之前我们这么写:
1 | public void oldMapType() { |
使用 stream 这么写:
1 | public void streamMapType() { |
看,是不是简单了很多?
看其体廓
Stream
本身是个接口,且内容过多,我们还是跳过代码定义,直接看类图吧。
乍一看,方法太多太乱,我们来一步一步分门别类的看。
再辨其貌
粗略从返回值来看,分为两种。一种是返回类型为 Stream
,一种是返回具体的某个类型或者 void
。
想一想,Stream
调用了自身的方法,返回的类型还是 Stream
,可以干什么?套娃?好吧,没错,你可以无限套娃。如果返回类型不是 Stream
,好了,套娃结束,GG。
再看方法类型,比如 empty()
,方法图标上是不是有个小菱形?什么,是铜钱的形状,调用该方法要 加钱
?不不不,这是给 JVM
交了保护费的意思,成为静态方法了,不用实例化就可以直接调用。
那么问题来了,静态方法,在没有实例化 Stream
之前就可以调用,此时还没有那只鸡,怎么鸡生蛋再蛋生鸡,怎么套娃!但是 Stream
的第一只鸡就这么通过静态方法产生了,这叫 无鸡之蛋
,这叫开天辟地。
至此,我们已经戴上了有色眼镜,给这些成员们在内心悄悄记在了不同的小本本:
- Stream 的创建
- Stream 的中间操作
- Stream 的终止操作
查水表
Stream
的成员方法,早已登记在册,我们可以轻松通过 Javadoc
来看他们到底干什么的。
Stream 的创建
方法 | 说明 |
---|---|
empty | 敷衍:返回一个没有任何元素的空流 |
concat | 合体:合并两个流成一个流 |
generate | 无尽:根据传入的Supplier返回一个无限流 |
iterate | 迭代:依次迭代生成元素的流 |
of | 加工:将传入的参数组合成一个流 |
Stream 的中间操作
方法 | 说明 |
---|---|
filter | 根据传入的条件过滤出符合要求的元素 |
distinct | 没错,和sql一样,去重 |
limit | 没错,和sql一样,取前几个 |
skip | 排除前n个元素 |
sorted | 自然排序,要求元素必须实现了 Comparable |
map | 将元素从T转成R |
flatMap | 将每个元素从T转成一个流,再合并成一个新的流 |
peek | 类似foreach,对流内的元素进行处理,但会重新返回流 |
Stream 的终止操作
方法 | 说明 |
---|---|
allMatch | 流元素中所有的都满足条件,才返回true |
anyMatch | 流元素中任何一个满足条件,就返回true |
noneMatch | 流元素中所有的都不满足条件,返回true |
count | 计算,返回元素个数 |
min | 根据比较器找最小的 |
max | 根据比较器找最大的 |
findAny | 返回任意一个元素(并行流可能不是第一个,串行是第一个) |
findFirst | 返回第一个元素 |
foreach | 和集合的foreach差不多 |
foreachOrdered | 并行流时,可以保证元素处理的顺序 |
reduce | 将流内的元素汇聚成一个最终目标值 |
toArray | 将流转成数组 |
collect | 将元素收集起来做操作(很重要,以后再说) |
收摊
Stream
的各个部位已经分拆完毕,摆上摊位,各位可自助购买,扫码付款。小本经营,诚信为先,自取之。