谷歌guava

番石榴

这是我尝试解释和探索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- 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

谷歌guava

谷歌guava_Google Guava MultiMaps相关推荐

  1. 谷歌guava_Google Guava:您永远不会知道的5件事

    谷歌guava 每个开发人员可以使用哪些鲜为人知的Google Guava功能? 它是那里最受欢迎的库之一,它是开源的,您可能已经知道了,它来自人们玩Quidditch作为一项真正的运动的地方(至少在 ...

  2. 谷歌guava_Google Guava BiMaps

    谷歌guava 接下来的番石榴之旅是另一个有用的收藏类型BiMap . 实际上,这非常简单,BiMap只是双向地图. 反转地图 普通的Java映射是一组键和值,您可以按键查找值,这非常有用,例如,说我 ...

  3. 谷歌guava_Google Guava –期货

    谷歌guava 这篇文章是我在Google Guava上的系列文章的延续,这次涵盖了Future. Futures类是用于使用Future / ListenableFuture接口的静态实用程序方法的 ...

  4. 谷歌guava_Google Guava BloomFilter

    谷歌guava 当Guava项目发布版本11.0时,新添加的功能之一是BloomFilter类. BloomFilter是唯一的数据结构,用于指示元素是否包含在集合中. 使BloomFilter有趣的 ...

  5. 谷歌guava_Google Guava v07范例

    谷歌guava 我们在TouK举办了一个名为"每周技术研讨会"的活动,即每个星期五的16:00,每个愿意参加的人都有一个演讲. 我们展示了我们在家学习和学习的东西,但是我们还设有一 ...

  6. Google Guava MultiMaps

    番石榴 这是系列文章中的第一篇,我将尝试解释和探索Google很棒的Guava java库 . 我在搜索Apache Commons Collections的通用版本时遇到了番石榴(Guava)–我需 ...

  7. Springboot项目中通过谷歌的guava实现令牌桶算法,来进行请求限流

    令牌桶算法是一种对请求限流的有效算法,核心思想是,一定时间内产生固定数量的令牌,拿到该令牌的请求可以通过,进行业务处理,没有拿到令牌的请求需要等待,直到新的令牌产生并领到该令牌,才可以通过,否则一直被 ...

  8. 谷歌Guava LoadingCache介绍

      在工作中,加Cache是非常常见的一种性能优化手段,操作系统底层.计算机硬件层为了性能优化加了各种各样的Cache,当然大多数都是对应用层透明的.但如果你想在应用层加Cache的话,可能就需要你自 ...

  9. [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具

    原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...

最新文章

  1. mysql生成100000个数据并检验索引的效果
  2. python+scapy 抓包与解析
  3. python PyQt5 adjustSize()(根据内容自适应大小)
  4. java 读取oracle的blob/clob
  5. CanalSharp-mysql数据库binlog的增量订阅消费组件Canal的.NET客户端
  6. React中的各个目录文件功能
  7. 我的 2018 年终总结
  8. IOS开发基础知识--碎片9
  9. 什么图用什么工具画?
  10. 1024福利|硬核无Bug,码上有红包!
  11. ESP8266 WIFI模块开发入门1 开发环境搭建
  12. 56个免费资源网站,总有你想要的。
  13. 新手建站之【网站备案】③
  14. python时区转换_Python pytz时区转换
  15. Andriod 获取手机CPU型号设备信息
  16. android beam小米,小米手机自定义空白卡模拟加密卡门禁卡教程
  17. 关于Android 抓包 与 反抓包
  18. grails springboot_Spring Boot 和 Grails 的不同点
  19. Snort入侵检测系统实验
  20. 大数据学习,Scala快速学习的方法

热门文章

  1. vue调用methods里的方法
  2. java中,剩下的这两个内部类不太好理解!
  3. 致我们最最最最最最最最最最最最最优秀的班主任——王老师
  4. HttpServletRequest中getAttribute()和getParameter()的区别
  5. c遗传算法的终止条件一般_KDD比赛之遗传算法(举例理解)
  6. 华为交换机ssh思科交换机_华为交换机 ssh 配置(极简版)
  7. redis集群依赖ruby
  8. XML——写出XML文档(XSLT+StAX)
  9. 使用vo注释做一个poi导出功能
  10. 多云平台_多云系统的授权