1. 程式人生 > >無情的Java 8 之 Stream和lambda表示式篇

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


 

不好意思,最近刷小視訊刷的有點上頭

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

好了,我要開始正經了

JAVA 8 已經推出有一段時間了, 相比之前, 我們操作集合的方式應該是這樣?

 

 

這樣?

 

或者是這樣?

        OK, 現在相信你看到這樣的遍歷方式可能也會吐槽一番


Stream 是用函數語言程式設計方式在集合類上進行復雜操作的工具,其集成了Java 8中的眾多新特性之一的聚合操作,開發者可以更容易地使用Lambda表示式,並且更方便地實現對集合的查詢、遍歷、過濾以及常見計算等本篇只舉例list和map, 為了便於理解, 我們先建立一個數據類

PS:為了解決螢幕空間, 註釋不標準, 請忽略

首先我們先操作List

  1. 遍歷所有人員的名字

    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技術相關文章,微信掃一掃關注作者公眾號