我已经在JDK 1.8上工作了几天,在那里我遇到了一些与此类似的代码:
List<Integer> list = Arrays.asList(1,2,3,4,5);
list.stream();
现在,对于使用流(java.util.stream
)的人来说,看起来既简单又干净,我找不到实现java.util.Collection.stream()
方法的实际类。
当我说list.stream()
时,我有以下问题:
java.util.stream.Stream
?我确实试图查看java.util.AbstractCollection
和java.util.AbstractList
的文档,但无法找到它。
答案 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