流是什麼

Philip發表於2018-08-31

流是Java API的新成員,它允許你以宣告性方式處理資料集合(通過查詢語句來表達,而不是臨時編寫一個實現)。就現在來說,你可以把它們看成遍歷資料集的高階迭代器。此外,流還可以透明地並行處理,你無需寫任何多執行緒程式碼了!

  那麼,流到底是什麼?簡短的定義就是“從支援資料處理操作的源生成的元素序列”。

  • 元素序列--就像集合一樣,流也提供了一個介面,可以訪問特定元素型別的一組有序值。因為集合是資料結構,所以它的主要目的是以特定的時間/空間複雜度儲存和訪問元素(如ArrayList與LindedList)。集合講的是資料,流講的是計算。
  • --流會使用一個提供資料來源,如集合、陣列或輸入/輸出資源。請注意,從有序集合生成流時會保留原有的順序。由列表生成的流,其元素順序和列表一致。
  • 資料處理操作--流的資料處理功能支援類似於資料庫的操作,以及函數語言程式設計語言中的常用操作,如filter,map,reduce,find,match,sort等。流操作可以順序執行,也可以並行執行。
  • 流水線--很多流操作本身會返回一個流,這樣多個操作可以連結起來,形成一個大的流水線。這讓一些優化成為可能,如延遲和短路。流水線的操作可以看作對資料來源進行資料庫式查詢。
  • 內部迭代--與使用迭代器顯式迭代的集合不同,流的迭代操作是在背後進行的。

請注意,和迭代器類似,流只能遍歷一次。遍歷完之後,我們就說這個流已經被消費掉了。你可以從原始資料來源那裡再獲得一個新的流來重新遍歷一次,就像迭代器一樣。如果對已經消費掉的流進行遍歷會丟擲java.lang.IllegalStateException:流已被操作或關閉。

使用Collection介面需要使用者去做迭代(比如for-each),這稱為外部迭代。相反,S天熱按庫使用內部迭代--它幫你把迭代做了,還把得到的流值存在了某個地方,你只要給出一個函式說要幹什麼就可以了。

相關文章