一、简介
Multimaps
是Guava
给自身新增的集合类型Multimap
提供的特有工具类,它提供了一些常用的、需要单独解释的方法.
二、使用场景
多个key对应相同value的情况
三、常用方法
1、将集合转换为Multimap
的方法 - index()
很多情况下,在我们业务的使用中想要将一个集合转换为Multimap
类型的数据.
如:需要将一批带有姓名、性别、年龄的用户通过年龄分组放入Multimap
中,就可以使用Multimaps.index(Iterable<V> values, Function<? super V, K> keyFunction)
方法.
实验代码:
//定义初始化用户集合信息
List<TestUserBean> list = Lists.newArrayList();
for (int i = 1; i < 10; i++) {
TestUserBean testUserBean = new TestUserBean();
testUserBean.setName("name" + i);
testUserBean.setSex("sex" + i);
testUserBean.setAge(i);
list.add(testUserBean);
}
//测试集合转Multimap方法 - index();
Multimap<Integer, TestUserBean> testBeanMultimap = Multimaps.index(list, TestUserBean::getAge);
System.out.println("=================测试集合转Multimap方法====================" + testBeanMultimap);
实验结果:
=================测试集合转Multimap方法===================={1=[{"name":"name1","sex":"sex1","age":1}], 2=[{"name":"name2","sex":"sex2","age":2}], 3=[{"name":"name3","sex":"sex3","age":3}], 4=[{"name":"name4","sex":"sex4","age":4}], 5=[{"name":"name5","sex":"sex5","age":5}], 6=[{"name":"name6","sex":"sex6","age":6}], 7=[{"name":"name7","sex":"sex7","age":7}], 8=[{"name":"name8","sex":"sex8","age":8}], 9=[{"name":"name9","sex":"sex9","age":9}]}
从结果中可以发现最终的生成规则是以age为key,对应的TestUserBean为value中的元素成员.与期望的规则保持一致.
2、将Multimap - (k,v)
对调的方法 - invertFrom()
MultiMaps
工具类提供了将原有Multimap
通过反转其key、value的值通过对调映射的模式,得到一个全新的Multimap
对象.
使用场景: 通常我们想以Multimap
的value集合作为key搜索条件的时候会使用到它.
实验代码:
TreeMultimap<Integer, String> testInvertMultimap = TreeMultimap.create();
testInvertMultimap.putAll(1,Lists.newArrayList("a1","b1","c1"));
testInvertMultimap.putAll(2,Lists.newArrayList("a2","b1","c2"));
TreeMultimap<String, Integer> invertFromMultimap = Multimaps.invertFrom(testInvertMultimap, TreeMultimap.create());
System.out.println("=================测试反转Multimap方法====================" + invertFromMultimap);
实验结果:
=================测试反转Multimap方法===================={a1=[1], a2=[2], b1=[1, 2], c1=[1], c2=[2]}
实验结果与预期保持一致.
3、Map
转Multimap
方法 - forMap()
咱工作中通过Map
转换成Multimap
也是一个比较常用的方法.Multimaps
工具类提供了与之对应的方法 - forMap(Map<K, V> map)
实验代码:
Map<String,String> map = ImmutableMap.of("k1","v1","k2","v2");
SetMultimap<String, String> setMultimap = Multimaps.forMap(map);
setMultimap.put("k1","v1");
System.out.println("=================测试map转Multimap方法====================" + setMultimap);
实验结果:
=================测试map转Multimap方法===================={k1=[v1], k2=[v2]}
预期与结果保持一致
值得注意的是:forMap()方法返回的SetMultimap是不支持put相关操作的
否则会出现:
Exception in thread "main" java.lang.UnsupportedOperationException
具体原因可以查看源码,是由于返回的时候new了一个MapMultimap
导致.
未完待续......
网友评论