Java Collection.stream()的实现
我已经在JDK 1.8上工作了几天,在那里我遇到了一些类似的代码: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()方法的实际类 当我
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