Eclipse Collections:让Java Streams更上一层楼
關鍵要點
\\- Eclipse Collections是一個高性能的Java集合框架,為原生JDK集合增加了豐富的功能。\\t
- Streams是JDK的一個非常受歡迎的功能,但它缺少了一些特性,嚴重依賴舊版的集合實現和冗長的API。\\t
- Eclipse Collections為傳統JDK數據結構提供了替代品,并支持Bag和Multimap等數據結構。\\t
- 將Streams重構為Eclipse Collections有助于提高代碼可讀性并減少內存占用。\\t
- 最重要的是,使用Eclipse Collections來重構Streams非常簡單!\
在Java 8中引入的Java Streams非常棒——讓我們可以充分利用lambda表達式來替換循環迭代代碼,讓代碼更加接近于函數式編程風格。
\\然而,盡管Streams帶來了改進,但它最終只是對現有集合框架的擴展,仍然背著很多包袱。
\\我們可以進一步改進嗎?我們能否擁有更豐富的接口和更清晰、更易讀的代碼?與傳統的集合相比,我們能否節省更多內存?我們能否更好、更無縫地支持函數式編程?
\\答案是肯定的!Eclipse Collections(以前叫作GS Collections)是Java Collections框架的一個替代品,我們可以用它來實現我們的目的。
\\在本文中,我們將演示幾個例子,將標準的Java代碼重構成Eclipse Collections數據結構和API,以及如何節省內存。
\\這里將會有很多代碼示例,它們將展示如何將使用標準Java集合和Streams的代碼改為使用Eclipse Collection框架的代碼。
\\在深入研究代碼之前,我們將花一些時間來了解Eclipse Collections是什么、我們為什么需要它,以及為什么需要將慣用的Java重構成Eclipse Collections。
\\\Eclipse Collections的歷史
\\Eclipse?Collections最初是由高盛公司創建的,他們的應用平臺有一個大型的分布式緩存組件。該系統將數百GB的數據存儲在內存中(現在仍在生產環境運行)。
\\事實上,緩存就是一個Map,我們在Map里保存和讀取對象。這些對象可以包含其他Map和集合。最初,緩存基于java.util.*包中的標準數據結構而構建。但很明顯,這些集合有兩個明顯的缺點:內存使用效率低下,而且接口非常有限(導致重復且難以閱讀的代碼)。由于問題源于集合的實現,因此無法通過額外的代碼庫來解決這些問題。為了同時解決這兩個問題,高盛公司決定從頭開始創建一個新的集合框架。
\\在當時,它似乎是一個激進的解決方案,不過它確實可行。現在,這個框架托管給了Eclipse基金會。
\\在文章的最后,我們分享了一些鏈接,這些鏈接將幫助你了解有關這個項目本身的更多信息、學習如何使用Eclipse Collections以及如何成為這個項目的代碼貢獻者。
\\\為什么要重構為Eclipse Collections?
\\Eclipse Collections有什么好處?因為它提供了更豐富的API、高效的內存使用以及更好的性能。在我們看來,Eclipse Collections是Java生態圈中最為豐富的集合庫。而且它與JDK中的集合完全兼容。
\\輕松遷移
\\在深入了解這些好處之前,請務必注意,遷移到Eclipse Collections非常容易,不一定要一次性完成所有工作。Eclipse Collections完全兼容JDK的java.util.* List、Set和Map接口。它也與JDK中的其他庫兼容,比如Collectors。我們的數據結構繼承了JDK的這些接口,所以它們可以作為JDK對應的替代品(不過Stack接口是不兼容的,還有新的不可變集合也不兼容,因為在JDK中不存在相應的接口)。
\\更豐富的API
\\實現了java.util.List、Set和Map接口的Eclipse Collections具有更豐富的API,我們將在后面的代碼示例中探討這些API。JDK中缺少了一些類型,例如Bag、Multimap和BiMap。Bag是一種多重集,可以包含重復元素。從邏輯上講,我們可以將其視為元素到它們出現次數的映射。BiMap是一種“倒置”的Map,不僅可以通過按鍵來查找值,也可以通過值來查找鍵。Multimap是一種Map,它的值就是集合(如Key-\u0026gt;List、Key-\u0026gt;Set等)。
\\eager還是lazy?
\\在使用Eclipse Collections時,我們可以非常容易地在lazy和eager兩種實現模式間切換,有助于編寫、理解和調試函數式代碼。與Streams API不同的是,eager是默認的模式。如果你想要使用lazy模式,只需要在開始你的邏輯代碼之前,在你數據結構上調用.asLazy()。
\\不可變集合接口
\\有了不可變集合,你可以在API層面通過不可變性寫出更加正確的代碼。在這種情況下,程序的正確性將由編譯器來保證,避免在執行過程中出現意外。借助不可變集合和更豐富的接口,你可以在Java中寫出純函數式代碼。
\\原始類型集合
\\Eclipse Collections也提供了原始類型的容器,所有原始集合類型都有不可變的對等物。值得一提的是,JDK的Streams支持int、long和double,而Eclipse Collections支持所有八個原始類型,并且可以定義用于直接保存原始值的集合(與它們的裝箱對象不同,例如Eclipse Collections IntList是一個int列表,而JDK中的List\u0026lt;Integer\u0026gt;是一個裝箱的原始值列表)。
\\沒有“bun”方法
\\什么是“bun”方法?這是由Oracle Java首席設計師Brian Goetz發明的一個比喻說法。一個漢堡包(兩片圓面包中間夾著肉)代表典型的流式代碼結構。在使用Java Streams時,如果你想做點什么,必須把你的方法放在兩塊“面包”之間——前面是stream()(或parallelStream())方法,后面是collect()方法。這些面包其實沒有什么營養,但如果沒有它們,你就無法吃到肉。在Eclipse Collections中,這些方法不是必需的。下面的例子演示了JDK中的bun方法:假設我們有一個名單,上面有他們的姓名和年齡,我們想要取出年齡超過21歲的人的姓名:
\\\var people = List.of(new Person(\"Alice\總結
以上是生活随笔為你收集整理的Eclipse Collections:让Java Streams更上一层楼的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用一个类根据Model属性生成SQL语句
- 下一篇: 056_Connect or Sync