前言
那 stream 到底是什么呢?
官方的简短定义:“从支持数据处理操作的源生成的元素序列”
分成三部分:
- 元素序列:你可以简单将它类比于一样,不过集合说的是数据的集合,而 stream 重点在于表达计算。如我们之前说到的 filter、map、sorted、limit等等
- 源:昨天我提到,如果了解过 Liunx 管道命令的朋友们,会知道,Liunx 的管道命令中的前一条命令的结果(输出流)就是执行下一条命令的输入流。 stream流其实也是类似的,每次执行完一个 filter、sorted 等等它们的返回值也是 stream 流,然后作为下一个操作的输入流,这种。
- 数据处理:这里说的处理,就是那些filter、map、sorted、limit等。
你可以把它理解为概念上或是形式上的数据结构,而不是具体的。
只能遍历的一次 Stream
Stream 流和 迭代器一样,它只能够迭代一次。
当它遍历完的时候,我们就称它已经消费完了。如果还想重新执行操作,那么就只能从原来的地方再获取一个流啦。
/**
* 图个乐子
*/
public static List<String> list = Arrays.asList("医医","一一","花花","菡菡","春春","宁姐","...");
public static void main(String[] args) {
Stream<String> stream = list.stream();
stream.forEach(System.out::println);
stream.forEach(System.out::println);
}
复制代码
当执行第二句stream.forEach(System.out::println);
时,会爆出如下异常:
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.sourceStageSpliterator(AbstractPipeline.java:279)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
at com.nzc.stream02.