Stream的父接口是BaseStream,后者是所有流实现的顶层接口,定义如下:
- public interface BaseStream<T, S extends BaseStream<T, S>>
- extends AutoCloseable {
- Iterator<T> iterator();
- Spliterator<T> spliterator();
- boolean isParallel();
- S sequential();
- S parallel();
- S unordered();
- S onClose(Runnable closeHandler);
- void close();
- }
其中,T为流中元素的类型,S为一个BaseStream的实现类,它里面的元素也是T并且S同样是自己:
S extends BaseStream<T, S>
是不是有点晕?
其实很好理解,我们看一下接口中对S的使用就知道了:如sequential()、parallel()这两个方法,它们都返回了S实例,也就是说它们分别支持对当前流进行串行或者并行的操作,并返回「改变」后的流对象。
如果是并行一定涉及到对当前流的拆分,即将一个流拆分成多个子流,子流肯定和父流的类型是一致的。子流可以继续拆分子流,一直拆分下去…
也就是说这里的S是BaseStream的一个实现类,它同样是一个流,比如Stream、IntStream、LongStream等。