Collection.stream()的实现

时间:2017-05-30 09:53:42

标签: java java-8 java-stream

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

List<Integer> list = Arrays.asList(1,2,3,4,5);
list.stream();

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

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

  1. 我从哪里获取java.util.stream.Stream
  2. 他们是如何在没有实际的情况下实施的?#34;令人不安的&#34;现有的集合?(假设他们没有触摸它们
  3. 我确实试图查看java.util.AbstractCollectionjava.util.AbstractList的文档,但无法找到它。

5 个答案:

答案 0 :(得分:17)

Java 8允许在接口中定义default methods

Collection<E>然后defines

default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

他们是如何添加它的。

答案 1 :(得分:16)

正如其他人指出的那样,.stream()方法在Collection界面本身实现为default method,您可以在official documentation中的方法签名中看到它:

default Stream<E> stream()

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

This SO thread on .stream()也许值得一读。

答案 2 :(得分:8)

它是Collection接口定义中的default method(另一个Java 8特性)。有关代码,请参阅Collection.java Line 580

default Stream<E> stream() {
   return StreamSupport.stream(spliterator(), false);
}

答案 3 :(得分:8)

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

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

从而覆盖Collection中的那个;这意味着它不是总是超类中的那个。

答案 4 :(得分:0)

"stream" 只是将功能方面分组的名称。真正的实现在 java.util.stream.ReferencePipeline 类中。

您可以在此处查看在中间和最终操作期间应用的代码。例如,要从集合到流,您可以按照路径

Collection::stream() -> StreamSupport::stream() -> ReferencePipeline.Head