番石榴
這是系列文章中的第一篇,我將嘗試解釋和探索Google很棒的Guava java庫 。
我在搜索Apache Commons Collections的通用版本時遇到了番石榴(Guava)–我需要一個Bimap
并且厭倦了必須使用強制類型轉換來填充我的代碼–但是我發現要好得多。
它不僅含有更復雜(但有用)集合類型-的各種實現屈德寧 , 多集 , Bimaps -我將詳細討論,但也設施,以支持具有不可變的集合編程的功能更強大的樣式, 功能和謂語對象。 這完全改變了我編寫Java的方式,同時使我對Java有時笨拙的語法越來越沮喪,這是我打算在以后的文章中探討的。
無論如何,只要有了介紹,再加上好東西。 我要看的第一件事是Multimap,它可能是我最常使用的單個Guava功能。
多圖
那么,您多久需要一次如下所示的數據結構?
Map<String,List<MyClass>> myClassListMap test2= new HashMap<String,List<MyClass>>()
如果你像我一樣,相當頻繁。 而且您是否發現自己一遍又一遍地編寫相同的樣板代碼?
要將鍵/值對放入此映射,您需要首先檢查您的鍵是否已經存在列表,以及是否沒有創建該列表。 您最終將按照以下內容寫一些東西:
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);
}
有點麻煩,如果需要檢查值的方法,該方法存在,刪除值,甚至遍歷整個數據結構。 那可能是很多代碼。
永遠不要擔心番石榴在這里!
就像標準的Java集合一樣,Guava定義了幾個接口和匹配的實現。 通常,您要對接口進行編碼,而只在創建接口時才擔心實現。 在這種情況下,我們對Multimaps感興趣。
因此,使用多圖,我們可以將數據結構聲明替換為以下內容:
Multimap<String,Object> myMultimap = ArrayListMultimap.create();
這里有幾件事要注意。 泛型類型聲明應該看起來非常熟悉,這正是您聲明普通Map的方式。
您可能一直希望在等號的右側看到new ArrayListMultimap<String,Object>()
。 好吧,所有Guava集合實現都提供了create
方法,該方法通常更簡潔,并且具有不必重復泛型類型信息的優點。
實際上,番石榴在標準Java集合中增加了類似的功能。 例如,如果檢查com.google.common.collect.Lists
,則會看到靜態的newArrayList()
和newLinkedList()
方法,因此即使使用標準Java集合,也可以利用這種簡潔性。 (我將在以后的文章中詳細介紹)。
因此,我們已經聲明并實例化了一個multimap,如何使用它們呢? 就像法線貼圖一樣簡單!
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
,這會有用得多。 確實會。 問題是有幾種不同的實現方式,一些使用Lists- ArrayListMultimap
, LinkedListMultimap
等-某些使用Sets- HashMultimap
, TreeMultimap
等。
要處理此問題(如果您需要直接使用列表中的列表或集合),需要定義幾個子接口。 ListMultimap
, SetMultimap
和SortedSetMultimap
。 這些都可以完成您期望的操作,它們返回集合的方法將返回approprite類型之一。
即
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 ,在這里您可以找到各種實現,應該能夠找到適合您需求的產品。
參考: Multimaps – Tom's Programming Blog博客上的JCG合作伙伴 Tom Jefferys提供的Google Guava 。
翻譯自: https://www.javacodegeeks.com/2012/12/google-guava-multimaps.html