java8 - 流是什麼

簡單的例子

從一串字符串中,取出2個長度爲1的字符。
public class Test {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("1", "2", "3", "11", "22", "33");
        Stream<String> stream = list.stream()
                .filter((str) -> str.length() == 1)
                .limit(2);
        System.out.println(stream.collect(Collectors.toList()));
    }
}

流簡介

流是Java8的新成員,容許以聲明性方式處理數據集合,即從支持數據處理操做生成的元素序列java

  • 數據處理操做:相似於數據庫的操做,以及函數式編程語言中的經常使用操做,如filter、 map、 reduce、 find、 match、 sort等。(見例子的list轉stream)
  • 源:提供數據的源,如集合、數組或輸入/輸出資源。 須要注意的是從有序集合生成流時會保留原有的順序。由列表生成的流,其元素順序與列表一致。(見例子的list)
  • 元素序列:流提供了一個接口,能夠訪問特定元素類型的一組有序值

流和集合

數據和計算

集合講的是數據,流講的是計算。數據庫

  • 集合是數據結構,因此它的主要目的是以特定的時間/空間複雜度存儲和訪問元素(如ArrayList 與 LinkedList)。
  • 流的目的在於表達計算,好比filter、 sorted和map。

外部迭代和內部迭代

集合是外部迭代,流是內部迭代。編程

  • 外部迭代:使用Collection接口須要用戶去作迭代(好比用for-each)
  • 內部迭代:Streams庫使用內部迭代——它把迭代作了,還把獲得的流值存在了某個地方,只要給出一個函數說要幹什麼就能夠了

流操做

流操做包括中間操做和終端操做。數組

  • 中間操做:中間操做會返回另外一個流。須要注意的是,這邊並不會計算,只是把流串起來。(見例子的stream的建立)
  • 終端操做:會從流的流水線生成結果。其結果是任何不是流的值,好比List、 Integer,甚至void。(見例子的輸出)
相關文章
相關標籤/搜索