Collection.stream()的实现

Adi*_*lai 17 java java-8 java-stream

我已经在JDK 1.8上工作了几天,在那里我遇到了一些与此类似的代码:

List<Integer> list = Arrays.asList(1,2,3,4,5);
list.stream();
Run Code Online (Sandbox Code Playgroud)

现在,对于使用streams(java.util.stream)的人来说,它看起来既简单又干净,我找不到实现该java.util.Collection.stream()方法的实际类.

当我说list.stream():我有以下问题:

  1. java.util.stream.Stream从哪里得到的?
  2. 他们是如何实现它而不实际"扰乱"现有的集合?(假设他们没有触及它们)

我也尝试过的单证看java.util.AbstractCollectionjava.util.AbstractList,但未能找到它.

Jer*_*and 17

Java 8允许在接口中定义默认方法.

Collection<E>然后定义:

default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}
Run Code Online (Sandbox Code Playgroud)

这就是他们添加它的方式.


Tam*_*dus 16

正如其他人所指出的那样,该.stream()方法在接口本身中作为默认方法实现Collection,您可以在官方文档中的方法签名中看到它:

default Stream<E> stream()
Run Code Online (Sandbox Code Playgroud)

如何实现流接口是集合的实现细节.但是,Stream为每个集合实现相同的繁重接口将是大量工作和重复,因此它们使用称为Spliterator的中间抽象.

这个SO线程.stream()也可能值得一读.


Flo*_*ser 8

它是Collection接口定义中的默认方法(另一个Java 8特性).有关代码,请参阅Collection.java第580行:

default Stream<E> stream() {
   return StreamSupport.stream(spliterator(), false);
}
Run Code Online (Sandbox Code Playgroud)


Eug*_*ene 8

你没有看到它,ArrayList因为它被定义Collection为一个默认方法(你可能已经有了这个).它可以在ArrayList任何其他集合中定义,从而覆盖它.例如,它被定义CopiesList为:

    @Override
    public Stream<E> stream() {
        return IntStream.range(0, n).mapToObj(i -> element);
    }
Run Code Online (Sandbox Code Playgroud)

从而压倒一个Collection; 这意味着它并不总是来自超级阶层的人.