谷歌guava_Google Guava MultiMaps
谷歌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- 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
谷歌guava
谷歌guava_Google Guava MultiMaps相关推荐
- 谷歌guava_Google Guava:您永远不会知道的5件事
谷歌guava 每个开发人员可以使用哪些鲜为人知的Google Guava功能? 它是那里最受欢迎的库之一,它是开源的,您可能已经知道了,它来自人们玩Quidditch作为一项真正的运动的地方(至少在 ...
- 谷歌guava_Google Guava BiMaps
谷歌guava 接下来的番石榴之旅是另一个有用的收藏类型BiMap . 实际上,这非常简单,BiMap只是双向地图. 反转地图 普通的Java映射是一组键和值,您可以按键查找值,这非常有用,例如,说我 ...
- 谷歌guava_Google Guava –期货
谷歌guava 这篇文章是我在Google Guava上的系列文章的延续,这次涵盖了Future. Futures类是用于使用Future / ListenableFuture接口的静态实用程序方法的 ...
- 谷歌guava_Google Guava BloomFilter
谷歌guava 当Guava项目发布版本11.0时,新添加的功能之一是BloomFilter类. BloomFilter是唯一的数据结构,用于指示元素是否包含在集合中. 使BloomFilter有趣的 ...
- 谷歌guava_Google Guava v07范例
谷歌guava 我们在TouK举办了一个名为"每周技术研讨会"的活动,即每个星期五的16:00,每个愿意参加的人都有一个演讲. 我们展示了我们在家学习和学习的东西,但是我们还设有一 ...
- Google Guava MultiMaps
番石榴 这是系列文章中的第一篇,我将尝试解释和探索Google很棒的Guava java库 . 我在搜索Apache Commons Collections的通用版本时遇到了番石榴(Guava)–我需 ...
- Springboot项目中通过谷歌的guava实现令牌桶算法,来进行请求限流
令牌桶算法是一种对请求限流的有效算法,核心思想是,一定时间内产生固定数量的令牌,拿到该令牌的请求可以通过,进行业务处理,没有拿到令牌的请求需要等待,直到新的令牌产生并领到该令牌,才可以通过,否则一直被 ...
- 谷歌Guava LoadingCache介绍
在工作中,加Cache是非常常见的一种性能优化手段,操作系统底层.计算机硬件层为了性能优化加了各种各样的Cache,当然大多数都是对应用层透明的.但如果你想在应用层加Cache的话,可能就需要你自 ...
- [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具
原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...
最新文章
- mysql生成100000个数据并检验索引的效果
- python+scapy 抓包与解析
- python PyQt5 adjustSize()(根据内容自适应大小)
- java 读取oracle的blob/clob
- CanalSharp-mysql数据库binlog的增量订阅消费组件Canal的.NET客户端
- React中的各个目录文件功能
- 我的 2018 年终总结
- IOS开发基础知识--碎片9
- 什么图用什么工具画?
- 1024福利|硬核无Bug,码上有红包!
- ESP8266 WIFI模块开发入门1 开发环境搭建
- 56个免费资源网站,总有你想要的。
- 新手建站之【网站备案】③
- python时区转换_Python pytz时区转换
- Andriod 获取手机CPU型号设备信息
- android beam小米,小米手机自定义空白卡模拟加密卡门禁卡教程
- 关于Android 抓包 与 反抓包
- grails springboot_Spring Boot 和 Grails 的不同点
- Snort入侵检测系统实验
- 大数据学习,Scala快速学习的方法
热门文章
- vue调用methods里的方法
- java中,剩下的这两个内部类不太好理解!
- 致我们最最最最最最最最最最最最最优秀的班主任——王老师
- HttpServletRequest中getAttribute()和getParameter()的区别
- c遗传算法的终止条件一般_KDD比赛之遗传算法(举例理解)
- 华为交换机ssh思科交换机_华为交换机 ssh 配置(极简版)
- redis集群依赖ruby
- XML——写出XML文档(XSLT+StAX)
- 使用vo注释做一个poi导出功能
- 多云平台_多云系统的授权