簡體   English   中英

Collection.stream() 的實現

[英]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()時,我有以下問題:

  1. 我從哪里獲得java.util.stream.Stream
  2. 他們是如何在不實際“干擾”現有 collections 的情況下實現它的?(假設他們沒有碰它們

我確實嘗試查看java.util.AbstractCollectionjava.util.AbstractList的文檔,但找不到它。

Java 8 允許在接口中定義默認方法

Collection<E>然后定義

default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

他們就是這樣添加的。

正如其他人指出的那樣, .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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM