Google Guava MultiMaps

番石榴

这是系列文章中的第一篇,我将尝试解释和探索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/value
  myMultimap.put('Fruits', 'Bannana');
  myMultimap.put('Fruits', 'Apple');
  myMultimap.put('Fruits', 'Pear');
  myMultimap.put('Vegetables', 'Carrot');

  // Getting the size
  int size = myMultimap.size();
  System.out.println(size);  // 4

  // Getting values
  Collection<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 Mutlimap
  for(String value : myMultimap.values()) {
   System.out.println(value);
  }

  // Removing a single value
  myMultimap.remove('Fruits','Pear');
  System.out.println(myMultimap.get('Fruits')); // [Bannana, Pear]

  // Remove all values for a key
  myMultimap.removeAll('Fruits');
  System.out.println(myMultimap.get('Fruits')); // [] (Empty Collection!)
 }
}

您可能想知道的一件事是,为什么get方法返回一个Collection而不是一个List ,这会有用得多。 确实会。 问题是有几种不同的实现方式,一些使用Lists- ArrayListMultimapLinkedListMultimap等-某些使用Sets- HashMultimapTreeMultimap等。

要处理此问题(如果您需要直接使用列表中的列表或集合),需要定义几个子接口。 ListMultimapSetMultimapSortedSetMultimap 。 这些都可以完成您期望的操作,它们返回集合的方法将返回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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值