簡單的例子
從一串字符串中,取出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。(見例子的輸出)