一、简介
Guava
提供了一个非常强大的集合处理工具 - Maps
.它提供了我们工作中许多常见的Map
处理场景.如Map
的diff
功能、常见的一堆对象唯一索引操作、转换普通的复杂Map<String ,List<Object>
为MultiMap<String ,Object>
,降低此类场景处理的复杂度等等.
二、常用方法
1、唯一索引方法 - uniqueIndex()
当我们平时处理一堆对象,并且将对象通过唯一的属性封装成Map
的时候,就可以使用Maps.uniqueIndex(Iterable<V> values, Function<? super V, K> keyFunction)
方法.它可以返回将keyFunction
中的处理结果作为每个对象的key
,对应对象作为value
的不可以变Map - ImmutableMap
.
实验代码:
//测试唯一索引方法 Maps - uniqueIndex
ImmutableMap<Integer, String> immutableMap = Maps.uniqueIndex(Lists.newArrayList("a1000000", "b20000000"), new Function<String, Integer>() {
@Override
public Integer apply(String input) {
return input.length();
}
});
//测试索引方法 Multimaps - index
System.out.println("==================测试Maps-niqueIndex()方法===================" + immutableMap);
Multimap<Integer, String> multimap = Multimaps.index(Lists.newArrayList("a1000000", "b20000000", "a1000000"), new Function<String, Integer>() {
@Override
public Integer apply(String input) {
return input.length();
}
});
实验结果:
==================测试Maps-niqueIndex()方法==================={8=a1000000, 9=b20000000}
==================测试Multimaps-Index方法==================={8=[a1000000, a1000000], 9=[b20000000]}
值得注意的是:
Maps.uniqueIndex(()
中不能存在指定唯一索引相同的索引节点,否则会抛出非法异常IllegalArgumentException: Multiple entries with same key
.
2、diff方法 - difference()
Maps
还提供了一个非常实用的diff方法 - difference( Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right)
.
它会对两个集合进行比较,并返回一个MapDifference<K, V>
对象.此对象分别提供了可以获取两个map
diff后的维恩图中各个部分的值.
实验代码:
//测试diff
Map<String, String> map1 = Maps.newHashMap();
map1.put("a", "a1");
map1.put("b", "b1");
map1.put("c", "c1");
Map<String, String> map2 = Maps.newHashMap();
map2.put("a", "a1");
map2.put("b", "b2");
map2.put("d", "d2");
MapDifference<String, String> mapDifference = Maps.difference(map1, map2);
System.out.println("==================测试Maps-difference()方法===================" + mapDifference);
System.out.println("==================测试diff - entriesInCommon()方法===================" + mapDifference.entriesInCommon());
System.out.println("==================测试diff - entriesOnlyOnLeft()方法===================" + mapDifference.entriesOnlyOnLeft());
System.out.println("==================测试diff - entriesOnlyOnRight()方法===================" + mapDifference.entriesOnlyOnRight());
System.out.println("==================测试diff - entriesDiffering()方法===================" + mapDifference.entriesDiffering());
System.out.println("==================测试diff - areEqual()方法===================" + mapDifference.areEqual());
实验结果:
==================测试Maps-difference()方法===================not equal: only on left={c=c1}: only on right={d=d2}: value differences={b=(b1, b2)}
==================测试diff - entriesInCommon()方法==================={a=a1}
==================测试diff - entriesOnlyOnLeft()方法==================={c=c1}
==================测试diff - entriesOnlyOnRight()方法==================={d=d2}
==================测试diff - entriesDiffering()方法==================={b=(b1, b2)}
==================测试diff - areEqual()方法===================false
可以看出MapDifference
对象会将diff后的结果都记录了下来:
a、entriesInCommon()
返回两个map中key和value都相同的记录.
b、entriesOnlyOnLeft()
返回两个map中left - map
独有的记录.
c、entriesOnlyOnRight()
返回两个map中right map
独有的记录.
d、entriesDiffering()
返回两个map中key
相同value
不同的记录.
e、areEqual()
返回两个map是否完全相同 true orElse false.
三、BiMap相关方法
Guava
将BiMap的公共方法划分到Maps工具类中,因为他们认为BiMap也是Map.
常见的实用方法如下:
1、获取线程安全的BiMap方法 - synchronizedBiMap()
Maps
工具类提供了支持返回一个线程安全的BiMap方法 - synchronizedBiMap(BiMap<K, V> bimap)
.
实验代码如下:
//测试BiMap线程安全方法 - synchronizedBiMap
BiMap<String, Integer> synchronizedBiMap = Maps.synchronizedBiMap(biMap);
System.out.println("==================测试BiMap - synchronizedBiMap()方法===================" + synchronizedBiMap);
2、获取不可变的BiMap方法 - unmodifiableBiMap()
使用unmodifiableBiMap()
方法,可以获得指定BiMap的不可变集.
实验代码:
//测试BiMap不可变方法 - unmodifiableBiMap
BiMap<String, Integer> unmodifiableBiMap = Maps.unmodifiableBiMap(synchronizedBiMap);
System.out.println("==================测试BiMap - unmodifiableBiMap()方法===================" + unmodifiableBiMap);
......未完待续