谷歌guava_Google Guava MultiMaps
谷歌guava
番石榴
這是我嘗試解釋和探索Google很棒的Guava java庫(kù)的系列文章中的第一篇。
我在搜索Apache Commons Collections的通用版本時(shí)遇到了番石榴(Guava)–我需要一個(gè)Bimap并且厭倦了必須使用強(qiáng)制類(lèi)型轉(zhuǎn)換來(lái)填充我的代碼–但是我發(fā)現(xiàn)要好得多。
它不僅含有更復(fù)雜(但有用)集合類(lèi)型-的各種實(shí)現(xiàn)屈德寧 , 多集 , Bimaps -我將詳細(xì)討論,但也設(shè)施,以支持具有不可變的集合編程的功能更強(qiáng)大的樣式, 功能和謂語(yǔ)對(duì)象。 這完全改變了我編寫(xiě)Java的方式,同時(shí)使我對(duì)Java有時(shí)笨拙的語(yǔ)法越來(lái)越沮喪,這是我打算在以后的文章中探討的。
無(wú)論如何,只要有了介紹,再加上好東西。 我要看的第一件事是Multimap,它可能是我最常使用的單個(gè)Guava功能。
多圖
那么,您多久需要一次如下所示的數(shù)據(jù)結(jié)構(gòu)?
Map<String,List<MyClass>> myClassListMap test2= new HashMap<String,List<MyClass>>()如果你像我一樣,經(jīng)常。 而且您是否發(fā)現(xiàn)自己一次又一次地編寫(xiě)相同的樣板代碼?
要將鍵/值對(duì)放入此映射,您需要首先檢查您的鍵是否已經(jīng)存在列表,以及是否沒(méi)有創(chuàng)建該列表。 您最終將按照以下內(nèi)容寫(xiě)一些東西:
void putMyObject(String key, Object value) {List<Object> myClassList = myClassListMap.get(key);if(myClassList == null) {myClassList = new ArrayList<object>();myClassListMap.put(key,myClassList);}myClassList.add(value); }有點(diǎn)麻煩,如果您需要用于檢查值的方法,該方法存在,刪除值或什至遍歷整個(gè)數(shù)據(jù)結(jié)構(gòu)該怎么辦。 那可能是很多代碼。
永遠(yuǎn)不要擔(dān)心番石榴在這里!
就像標(biāo)準(zhǔn)的Java集合一樣,Guava定義了幾個(gè)接口和匹配的實(shí)現(xiàn)。 通常,您要對(duì)接口進(jìn)行編碼,而僅在創(chuàng)建接口時(shí)才擔(dān)心實(shí)現(xiàn)。 在這種情況下,我們對(duì)Multimaps感興趣。
因此,使用多圖,我們可以將數(shù)據(jù)結(jié)構(gòu)聲明替換為以下內(nèi)容:
Multimap<String,Object> myMultimap = ArrayListMultimap.create();這里有幾件事要注意。 泛型類(lèi)型聲明應(yīng)該看起來(lái)非常熟悉,這正是您聲明普通Map的方式。
您可能已經(jīng)期望在等號(hào)的右側(cè)看到new ArrayListMultimap<String,Object>() 。 好吧,所有Guava集合實(shí)現(xiàn)都提供一個(gè)create方法,該方法通常更簡(jiǎn)潔,并且具有不必重復(fù)泛型類(lèi)型信息的優(yōu)點(diǎn)。
實(shí)際上,番石榴為標(biāo)準(zhǔn)Java集合添加了類(lèi)似的功能。 例如,如果檢查com.google.common.collect.Lists ,則會(huì)看到靜態(tài)的newArrayList()和newLinkedList()方法,因此即使使用標(biāo)準(zhǔn)Java集合,也可以利用這種簡(jiǎn)潔性。 (我將在以后的文章中詳細(xì)介紹)。
因此,我們已經(jīng)聲明并實(shí)例化了一個(gè)multimap,如何使用它們呢? 就像法線(xiàn)貼圖一樣簡(jiǎn)單!
public class MutliMapTest {public static void main(String... args) {Multimap<String, String> myMultimap = ArrayListMultimap.create();// Adding some key/valuemyMultimap.put('Fruits', 'Bannana');myMultimap.put('Fruits', 'Apple');myMultimap.put('Fruits', 'Pear');myMultimap.put('Vegetables', 'Carrot');// Getting the sizeint size = myMultimap.size();System.out.println(size); // 4// Getting valuesCollection<string> fruits = myMultimap.get('Fruits');System.out.println(fruits); // [Bannana, Apple, Pear]Collection<string> vegetables = myMultimap.get('Vegetables');System.out.println(vegetables); // [Carrot]// Iterating over entire Mutlimapfor(String value : myMultimap.values()) {System.out.println(value);}// Removing a single valuemyMultimap.remove('Fruits','Pear');System.out.println(myMultimap.get('Fruits')); // [Bannana, Pear]// Remove all values for a keymyMultimap.removeAll('Fruits');System.out.println(myMultimap.get('Fruits')); // [] (Empty Collection!)} }您可能想知道的一件事是,為什么get方法返回的是Collection而不是List ,這會(huì)有用得多。 確實(shí)會(huì)。 問(wèn)題是有幾種不同的實(shí)現(xiàn)方式,一些使用Lists- ArrayListMultimap , LinkedListMultimap等-某些使用Sets- HashMultimap , TreeMultimap等。
要處理此問(wèn)題(如果您需要直接使用列表中的列表或集合),需要定義幾個(gè)子接口。 ListMultimap , SetMultimap和SortedSetMultimap 。 這些都可以完成您期望的操作,并且它們的返回集合的方法將返回approprite類(lèi)型之一。
即
ListMutlimap<String,String> myMutlimap = ArrayListMultimap.create();List<string> myValues = myMutlimap.get('myKey'); // Returns a List, not a Collection.這基本上就是他們的全部。 我建議您查看以下API: http : //docs.guava-libraries.googlecode.com/git-history/release09/javadoc/com/google/common/collect/Multimap.html ,在這里您可以找到各種實(shí)現(xiàn),應(yīng)該能夠找到適合您需求的產(chǎn)品。
參考: Multimaps – Tom's Programming Blog博客上JCG合作伙伴 Tom Jefferys的Google Guava 。
翻譯自: https://www.javacodegeeks.com/2012/12/google-guava-multimaps.html
谷歌guava
總結(jié)
以上是生活随笔為你收集整理的谷歌guava_Google Guava MultiMaps的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓注入工具(安卓注入)
- 下一篇: 自动生成优化的Java类专业知识