[英]Implementation of Collection.stream()
我已經在 JDK 1.8 上工作了幾天,我遇到了一些與此類似的代碼:
List<Integer> list = Arrays.asList(1,2,3,4,5);
list.stream();
Now, easy and clean as it may appear to the people who have been working with streams ( java.util.stream
), I could not find the the actual class that implements the java.util.Collection.stream()
method.
當我說list.stream()
時,我有以下問題:
java.util.stream.Stream
? 我確實嘗試查看java.util.AbstractCollection
和java.util.AbstractList
的文檔,但找不到它。
正如其他人指出的那樣, .stream()
方法是作為Collection
接口本身的默認方法實現的,正如您在官方文檔的方法簽名中看到的那樣:
default Stream<E> stream()
流接口的實現方式是集合的實現細節。 然而,為每個集合實現相同的重Stream
接口將是大量的工作和重復,因此他們使用稱為Spliterator的中間抽象。
.stream()
上的這個 SO 線程也可能值得一讀。
您沒有在ArrayList
看到它,因為它在Collection
定義為默認方法(您可能已經知道了)。 但它可以在ArrayList
或任何其他集合中定義,從而覆蓋它。 例如,它在CopiesList
定義為:
@Override
public Stream<E> stream() {
return IntStream.range(0, n).mapToObj(i -> element);
}
因此覆蓋了Collection
的一個; 這意味着它並不總是來自超類。
它是 Collection 接口定義中的默認方法(另一個 Java 8 特性)。 有關代碼,請參閱Collection.java 第 580 行:
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
“流”只是對后面的功能方面進行分組的名稱。 真正的實現在java.util.stream.ReferencePipeline
類中。
您可以在此處查看在中間和最終操作期間應用的代碼。 例如,要從集合到流,您可以按照路徑
Collection::stream() -> StreamSupport::stream() -> ReferencePipeline.Head
我們將得到java.util.stream.Stream
ZA8CFDE6331BD4B62AC96F891 接口方法stream();
這可能是因為 Java 8 中引入的默認方法。
在 java 8 之前,我們只能在接口中聲明方法。 從 Java 8 開始,我們還可以在接口中定義方法或默認方法。
在我們的例子stream()
是接口 Collection 的默認方法。 例如,在以下情況下,當您執行list.stream()
時,將調用 Collection 的默認方法stream()
並將對象列表轉換為 Stream 並將其返回,以便您可以根據需要使用操作進一步處理它如過濾器、map、flatMap等。
List<String> list = Arrays.asList("abc","pqr","xyz");
Stream<String> stream = list.stream();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.