Guava Multimap告别Map的一对一映射

我们熟悉的map映射操作一般是这样的。
Map map = new HashMap<>();
		map.put("a", "A");
		map.put("a", "B");
		map.put("a", "C");
		map.put("c", "D");
		
		for(String key : map.keySet()){
			System.out.println(map.get(key));
		}

我们想将ABC都用"a"来映射,当时 结果却不是我们想要的

输出结果:

C
D

很显然 "a" 做键的前两次put都被最后一次覆盖掉了,即HashMap多次使用同一个对象做键的话,前面的将会被覆盖。幸运的是Guava 提供了很多实现了MultiMap接口的类可以实现一个对象映射多个值。这里我只演示两个常用的。ListMultimap、ArrayListMultimap 和HashMultiMap  这三个都实现了Multimap,并且ArrayListMultimap继承了ListMultimap

public class Test {
	public static void main(String[] args) {
		ListMultimap multimap = ArrayListMultimap.create();
		multimap.put("a", "A");
		multimap.put("a", "B");
		multimap.put("a", "C");
		multimap.put("b", "D");
		for (String firstName : multimap.keySet()) {
			List lastNames = multimap.get(firstName);//注意获取的values是一个List
			System.out.println(firstName + ": " + lastNames);
		}
		
		HashMultimap map = HashMultimap.create();
		map.put("a", "A");
		map.put("a", "B");
		map.put("a", "C");
		map.put("b", "D");
		for(String key : map.keySet()){
			Set sets = map.get(key);//注意获取的values是一个Set
			System.out.println(key + ": "+sets);
		}
	}
}
输出结果:
a: [A, B, C]
b: [D]
a: [A, B, C]
b: [D]

Guava 也提供了MultiSet接口,实现这个几口的数据结构在保留set的其他功能基础上。能够存储多个相同的元素。平常我们使用的例如HashSet是不能存放多个相同元素的,即使多次add也只会保留一个。

此外 Guava 还提供了一个 MultiMaps类来辅助Multimap的使用,使得Multimap像Map一样方便开发者使用

这里列出几个我觉得比较使用的方法:

static  Multimap synchronizedMultimap(Multimap multimap)
Returns a synchronized (thread-safe) multimap backed by the specified multimap.

static  ListMultimap synchronizedListMultimap(ListMultimap multimap)
Returns a synchronized (thread-safe) ListMultimap backed by the specified multimap.

static  Map> asMap(ListMultimap multimap)
Returns multimap.asMap(), with its type corrected from Map> to Map>.

static  Map> asMap(Multimap multimap)
Returns multimap.asMap().

static  ListMultimap filterKeys(ListMultimap unfiltered,Predicate keyPredicate)
Returns a multimap containing the mappings in unfiltered whose keys satisfy a predicate

static  Multimap filterKeys(Multimap unfiltered,Predicate keyPredicate)
Returns a multimap containing the mappings in unfiltered whose keys satisfy a predicate.

static  Multimap filterValues(Multimap unfiltered,Predicate valuePredicate)
Returns a multimap containing the mappings in unfiltered whose values satisfy a predicate.






你可能感兴趣的:(Guava)