Stream是Java8中新加入的api,更準確的說:html
Java 8 中的 Stream 是對集合(Collection)對象功能的加強,它專一於對集合對象進行各類很是便利、高效的聚合操做,或者大批量數據操做 。Stream API 藉助於一樣新出現的 Lambda 表達式,極大的提升編程效率和程序可讀性.
之前咱們處理複雜的數據只能經過各類for循環,不只不美觀,並且時間長了之後可能本身都看不太明白之前的代碼了,但有Stream之後,經過filter,map,limit等等方法就可使代碼更加簡潔而且更加語義化。java
流機器(動畫來自 Tagir Valeev)編程
Stream的效果就像上圖展現的它能夠先把數據變成符合要求的樣子(map),吃掉不須要的東西(filter)而後獲得須要的東西(collect)。api
而關於如何使用,下面就用一個簡單的例子來講明。多線程
下面是一個簡單的示例代碼oracle
List<Dish> menu = ... List<String> lowCaloricDishesName = menu.stream() //篩選出卡路里大於400的 .filter(d -> d.getCalories() < 400) //抽取名字屬性建立一個新的流 .map(Dish::getName) //這個流按List類型返回 .collect(toList());
在這段代碼 filter 和 map 操做被稱爲中間操做,中間操做會返回一個新的流,而 collect 則被稱爲終端操做只有終端操做纔會讓整個流執行並關閉。也就是說 每一個流只能遍歷一次 ,由於collect之後這個流就已經關閉了。性能
List<String> test = Arrays.asList("Java8", "In", "Action"); Stream<String> s = title.stream(); s.forEach(System.out::println); s.forEach(System.out::println); // 代碼會拋出一個java.lang.IllegalStateException異常
想了解更多Stream的api能夠查閱官方文檔。優化
Stream能夠分爲串行與並行兩種,串行流和並行流差異就是單線程和多線程的執行。動畫
stream()和parallelStream()方法返回的都是java.util.stream.Stream<E>類型的對象,說明它們在功能的使用上是沒差異的。惟一的差異就是單線程和多線程的執行。spa
記得之前正好看過一篇關於Stream的性能的文章,在此就直接引用結論了
結果能夠總結以下:
1.對於簡單操做,好比最簡單的遍歷,Stream串行API性能明顯差於顯示迭代,但並行的Stream API可以發揮多核特性。
2.對於複雜操做,Stream串行API性能能夠和手動實現的效果匹敵,在並行執行時Stream API效果遠超手動實現。因此,若是出於性能考慮,1. 對於簡單操做推薦使用外部迭代手動實現,2. 對於複雜操做,推薦使用Stream API, 3. 在多核狀況下,推薦使用並行Stream API來發揮多核優點,4.單核狀況下不建議使用並行Stream API。
若是出於代碼簡潔性考慮,使用Stream API可以寫出更短的代碼。即便是從性能方面說,儘量的使用Stream API也另一個優點,那就是隻要Java Stream類庫作了升級優化,代碼不用作任何修改就能享受到升級帶來的好處。