番石榴
这是系列文章中的第一篇,我将尝试解释和探索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