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()
:我有以下问题:
java.util.stream.Stream
从哪里得到的?我也尝试过的单证看java.util.AbstractCollection
和java.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()
也可能值得一读.
它是Collection接口定义中的默认方法(另一个Java 8特性).有关代码,请参阅Collection.java第580行:
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
Run Code Online (Sandbox Code Playgroud)
你没有看到它,ArrayList
因为它被定义Collection
为一个默认方法(你可能已经有了这个).但它可以在ArrayList
任何其他集合中定义,从而覆盖它.例如,它被定义CopiesList
为:
@Override
public Stream<E> stream() {
return IntStream.range(0, n).mapToObj(i -> element);
}
Run Code Online (Sandbox Code Playgroud)
从而压倒一个Collection
; 这意味着它并不总是来自超级阶层的人.
归档时间: |
|
查看次数: |
1838 次 |
最近记录: |