無情的Java 8 之 Stream和lambda表達式篇


 

很差意思,最近刷小視頻刷的有點上頭java

看到這圖就不自覺的要來一句:"臥槽,無情"編程

好了,我要開始正經了微信

JAVA 8 已經推出有一段時間了, 相比以前, 咱們操做集合的方式應該是這樣?函數式編程

 

 

這樣?函數

 

或者是這樣?工具

        OK, 如今相信你看到這樣的遍歷方式可能也會吐槽一番優化


Stream 是用函數式編程方式在集合類上進行復雜操做的工具,其集成了Java 8中的衆多新特性之一的聚合操做,開發者能夠更容易地使用Lambda表達式,而且更方便地實現對集合的查找、遍歷、過濾以及常見計算等本篇只舉例list和map, 爲了便於理解, 咱們先建立一個數據類
PS:爲了解決屏幕空間, 註釋不標準, 請忽略url

首先咱們先操做List插件

  1. 遍歷全部人員的名字3d

    2.過濾年齡大於12的

    3.過濾年齡大於12的總人數

    4.根據年齡排序

     5.得到年齡最小的

 

     6.年齡最大的

      7.將全部的名字打印出來並用逗號隔開

      8.全部人年齡的總和

      9.關於統計類 IntSummaryStatistics

 

-------------我是一條紅色的分界線-----------

        關於Map中Stram的操做

        1.list轉map

        2.在轉換過程當中, key重複的狀況的處理方式

(key1,key2) -> key2是一種表達式, 表示轉換map時,若是有兩個相同的key,

則取後面的key2替換前面的key1,key1,key2兩個關鍵字能夠隨意修改.

        3.key重複時,將前面的value和後面的value相加

 

 小結: 

        先說下Stream的優點:它是java對集合操做的優化,相較於迭代器,使用Stream的速度很是快,而且它支持並行方式處理集合中的數據,默認狀況能充分利用cpu的資源。同時支持函數式編程,代碼很是簡潔。

 

  Stream是一種用來計算數據的流,它自己並無存儲數據。你能夠認爲它是對數據源的一個映射或者視圖。

 

  它的工做流程是:獲取數據源->進行一次或屢次邏輯轉換操做->進行歸約操做造成新的流(最後能夠將流轉換成集合)。

        

Stream的特性

        1.中間操做惰性執行:一個流後面能夠跟隨0到多箇中間操做,主要目的是打開流,並無真正的去計算,而是作出某種程度的數據映射/過濾,而後返回一個新的流,交給下一個操做使用。這類操做都是惰性化的(lazy),就是說,僅僅調用到這類方法,並無真正開始流的遍歷,並無消耗資源。

還有多箇中間操做的話,這裏的時間複雜度並非n個for循環,轉換操做都是 lazy 的,多個轉換操做只會在 Terminal 操做的時候融合起來,一次循環完成。能夠這樣簡單的理解,Stream 裏有個操做函數的集合,每次轉換操做就是把轉換函數放入這個集合中,在Terminal操做的時候循環 Stream 對應的集合,而後對每一個元素執行全部的函數。

      2.流的末端操做只能有一次:當這個操做執行後,流就被使用「光」了,沒法再被操做。因此這一定是流的最後一個操做。以後若是想要操做就必須新打開流。

 

關於流被關閉不能再操做的異常:

 

這裏曾經遇到過一個錯誤:stream has already been operated upon or closed

 

意思是流已經被關閉了,這是由於當咱們使用末端操做以後,流就被關閉了,沒法再次被調用,若是咱們想重複調用,只能從新打開一個新的流.



OK, 到此, 本文暫時告一段落, 以後的代碼中會大量體現stream和lambda表達式的代碼, 但願你們持續關注
下一篇, 將給你們帶來一個福利插件, 但願關注

原創:微微藍


想要提高本身,工做中遇到的問題,更多JAVA技術相關文章,微信掃一掃關注做者公衆號

相關文章
相關標籤/搜索