0%

stream and lambda(6) - stream 简介

看完了 lambda,是时候了解下 stream 了。到这里,我们的第二位主角终于登场了。Java8 推出这个极具实用性的 stream

黄四郎:Stream,Java8 用的 stream。Stream,You know?

马邦德:Stream,流,文件操作用的!

黄四郎:你看看这位师爷就是装糊涂的高手,Stream,说成操作文件的,那 IO 是什么?

马邦德:流,Java8 stream,提供集合便捷操作的。

未见其貌,先闻其声

让我们先从一个小例子入手:将 List<Integer> 转为 List<String>。

Java8 之前我们这么写:

1
2
3
4
5
6
7
8
public void oldMapType() {
List<Integer> integers = Arrays.asList(1, 2, 5, 7, 9, 11, 3);
List<String> resList = new ArrayList<>();
for (Integer integer : integers) {
resList.add(String.valueOf(integer));
}
System.out.println(resList);
}

使用 stream 这么写:

1
2
3
4
5
public void streamMapType() {
List<Integer> integers = Arrays.asList(1, 2, 5, 7, 9, 11, 3);
List<String> resList = integers.stream().map(String::valueOf).collect(Collectors.toList());
System.out.println(resList);
}

看,是不是简单了很多?

看其体廓

Stream 本身是个接口,且内容过多,我们还是跳过代码定义,直接看类图吧。
Stream class diagram

乍一看,方法太多太乱,我们来一步一步分门别类的看。

再辨其貌

粗略从返回值来看,分为两种。一种是返回类型为 Stream ,一种是返回具体的某个类型或者 void

想一想,Stream 调用了自身的方法,返回的类型还是 Stream,可以干什么?套娃?好吧,没错,你可以无限套娃。如果返回类型不是 Stream,好了,套娃结束,GG。

再看方法类型,比如 empty(),方法图标上是不是有个小菱形?什么,是铜钱的形状,调用该方法要 加钱?不不不,这是给 JVM 交了保护费的意思,成为静态方法了,不用实例化就可以直接调用。

那么问题来了,静态方法,在没有实例化 Stream 之前就可以调用,此时还没有那只鸡,怎么鸡生蛋再蛋生鸡,怎么套娃!但是 Stream 的第一只鸡就这么通过静态方法产生了,这叫 无鸡之蛋,这叫开天辟地。

至此,我们已经戴上了有色眼镜,给这些成员们在内心悄悄记在了不同的小本本:

  1. Stream 的创建
  2. Stream 的中间操作
  3. 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 的各个部位已经分拆完毕,摆上摊位,各位可自助购买,扫码付款。小本经营,诚信为先,自取之。