Eclipse Collections的API設計演進

banq發表於2018-12-19

Eclipse Collections是一個開源Java集合框架,可以用Java編寫功能齊全,流暢的程式碼,這篇文章解釋了成熟Java集合庫的演化策略:

歷史
Eclipse Collections於2004年在Goldman Sachs開始作為一個名為Caramel的集合框架開始,在2012年,它作為一個名為GS Collections的專案開放給GitHub。多年來,大約40名來自同一公司的開發人員為集合框架做出了貢獻。為了最大限度地發揮開源專案的最佳性質,GS Collections被遷移到Eclipse Foundation,在2015年重新命名為Eclipse Collections。現在該框架對社群完全開放,接受貢獻!

設計目標
Eclipse Collections旨在提供豐富,功能,流暢和有趣的API以及記憶體高效的資料結構,同時提供與Java Collections的互操作性。它提供了缺失的型別,如Bag,Multimap,Stack,BiMap,Interval。

框架的演變
在過去14年多的時間裡,框架已經成熟,最高介面:RichIterable現在有超過100種方法。經過仔細考慮後,這些方法被包含在介面中。

比如讓我們在Eclipse Collections版本9.0.0中新增的簡單API,實現一個RichIterablecountBy() :

MutableList<String> strings = Lists.mutable.with(
        "1", "2", "2", "3", "3", "3", "4", "4", "4", "4");
Bag<Integer> integers = strings.collect(
        Integer::valueOf, 
        Bags.mutable.empty());
Assert.assertEquals(1, integers.occurrencesOf(1));
Assert.assertEquals(2, integers.occurrencesOf(2));
Assert.assertEquals(3, integers.occurrencesOf(3));
Assert.assertEquals(4, integers.occurrencesOf(4));



上面計算整數的解決方案是有效的,但是,它並不直觀。沒有經驗的開發人員可能很難實現此解決方案。因此,我們決定新增countBy(),現在程式碼看起來更實用,更流暢,更直觀。

MutableList<String> strings = Lists.mutable.with(
        "1", "2", "2", "3", "3", "3", "4", "4", "4", "4");
Bag<Integer> integers = strings.countBy(Integer::valueOf);
Assert.assertEquals(1, integers.occurrencesOf(1));
Assert.assertEquals(2, integers.occurrencesOf(2));
Assert.assertEquals(3, integers.occurrencesOf(3));
Assert.assertEquals(4, integers.occurrencesOf(4));


GitHub專案


 

相關文章