Java Collection.stream()的实现

Java Collection.stream()的实现,java,java-8,java-stream,Java,Java 8,Java Stream,我已经在JDK 1.8上工作了几天,在那里我遇到了一些类似的代码: List<Integer> list = Arrays.asList(1,2,3,4,5); list.stream(); List List=Arrays.asList(1,2,3,4,5); list.stream(); 现在,对于那些一直在使用streams(java.util.stream)的人来说,这看起来很简单,但我找不到实现java.util.Collection.stream()方法的实际类 当我

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

List<Integer> list = Arrays.asList(1,2,3,4,5);
list.stream();
List List=Arrays.asList(1,2,3,4,5);
list.stream();
现在,对于那些一直在使用streams(
java.util.stream
)的人来说,这看起来很简单,但我找不到实现
java.util.Collection.stream()方法的实际类

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

  • 我从哪里获得
    java.util.stream.stream
  • 他们是如何在不“干扰”现有集合的情况下实现它的?(假设他们没有触及它们)

  • 我确实试着浏览了
    java.util.AbstractCollection
    java.util.AbstractList
    的文档,但找不到它。

    Java8允许定义in接口

    收集
    然后:

    defaultstream(){
    返回StreamSupport.stream(spliterator(),false);
    }
    
    这就是他们添加它的方式。

    它是集合接口定义中的一个(另一个Java 8特性)。有关代码,请参见:

    default Stream<E> stream() {
       return StreamSupport.stream(spliterator(), false);
    }
    
    defaultstream(){
    返回StreamSupport.stream(spliterator(),false);
    }
    
    正如其他人指出的那样,
    .stream()
    方法在
    集合
    接口本身中实现为一个函数,您可以在中的方法签名中看到:

    defaultstream()
    
    如何实现流接口是集合的一个实现细节。然而,为每个集合实现相同的重
    接口将需要大量的工作和重复,因此它们使用一个称为的中间抽象


    可能也值得一读。

    您在
    ArrayList
    中没有看到它,因为它在
    集合中定义为默认方法(您可能已经得到了它)。但它可以在
    ArrayList
    或任何其他集合中定义,从而覆盖它。例如,它在
    副本列表中定义为:

        @Override
        public Stream<E> stream() {
            return IntStream.range(0, n).mapToObj(i -> element);
        }
    
    @覆盖
    公共流(){
    返回IntStream.range(0,n).mapToObj(i->element);
    }
    
    从而覆盖了
    集合中的一个
    ;这意味着它并不总是来自超类。

    “stream”只是一个名称,用于将后面的功能方面分组。真正的实现在
    java.util.stream.ReferencePipeline
    类中

    在这里,您可以看到在中间和最终操作期间应用的代码。例如,要从集合转到流,可以遵循以下路径

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

    stream()
    Collection
    中被定义为默认方法,谢谢。我所缺少的是在JDK1.8的接口中引入默认方法。我很高兴这一声誉(因为我的答案是第一个),但我仍然可以认识到,从那时起,其他答案增加了进一步的解释。
        @Override
        public Stream<E> stream() {
            return IntStream.range(0, n).mapToObj(i -> element);
        }
    
    Collection::stream() -> StreamSupport::stream() -> ReferencePipeline.Head