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