什麼是Stream? |
Stream是一些數據上的抽象視圖。
舉例來說,Stream可以是列表、文件中的每行數據,或者其他任意元素的序列的一個視圖。Stream API提供了可以連續執行,或者並行執行的操作集合。
開發者需要記住的是Stream是一個高層的抽象,而不是一個數據結構。Stream不會存儲你的數據。 Stream本身是懶惰的,只有使用到它們時纔會開始計算。這使我們能夠產生無數的數據流。
在Java8中,你能夠像下面一樣編寫一個Stream來產生無數的唯一標識碼。
public static void main(String[] args) {
Stream<String> uuidStream = Stream.generate(() -> UUID.randomUUID().toString());
}
在Stream的接口中,有很多像of、generate和iterate一樣的靜態工廠方法,它們可以用來創建Stream的實例。上面展示的generate方法以Supplier爲參數。Supplier是一個函數式接口,用來描述一個不需要參數並返回一個值的函數。我們傳遞給generate方法一個供應者,那麼當調用的時候,就能產生一個唯一標識碼。
怎麼用Stream? |
一個Stream表面上與一個集合很類似,允許你改變和獲取數據,但實際上卻有很大區別:
1、Stream自己不會存儲元素。元素可能被存儲在底層的集合中,或者根據需要產生出來。
2、Stream操作符不會改變源對象。相反,他們返回一個持有新結果的Stream。
3、Stream操作符可能是延遲執行的。意思是它們會等到需要結果的時候才執行。
Stream遵循“做什麼,而不是怎麼去做”的原則。只需要描述需要做什麼,而不用考慮程序是怎樣實現的。
Stream很像Iterator,單向,只能遍歷一遍。但是Stream可以只通過一行代碼就實現多線程的並行計算。
當使用Stream時,會有三個階段:
1、創建一個Stream。
2、在一個或多個步驟中,將初始Stream轉化到另一個Stream的中間操作。
3、使用一個終止操作來產生一個結果。該操作會強制他之前的延遲操作立即執行。在這之後,該Stream就不會在被使用了。
Stream的操作 |
中間操作包括:map (mapToInt, flatMap 等)、 filter、distinct、sorted、peek、limit、skip、parallel、sequential、unordered。
終止操作包括:forEach、forEachOrdered、toArray、reduce、collect、min、max、count、anyMatch、allMatch、noneMatch、findFirst、findAny、iterator。