Guava Multimap<K,V>告别Map的一对一映射

本文介绍了Guava库中提供的Multimap接口及其实现类,包括ListMultimap和HashMultimap,对比了它们与传统HashMap的区别,并展示了如何使用这些工具进行多值映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们熟悉的map映射操作一般是这样的。
Map<String, String> 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<K,V>接口的类可以实现一个对象映射多个值。这里我只演示两个常用的。ListMultimap<K,V>、ArrayListMultimap<K,V> 和HashMultiMap<K,V>  这三个都实现了Multimap<K,V>,并且ArrayListMultimap<K,V>继承了ListMultimap<K,V>

public class Test {
	public static void main(String[] args) {
		ListMultimap<String, String> 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<String> lastNames = multimap.get(firstName);//注意获取的values是一个List
			System.out.println(firstName + ": " + lastNames);
		}
		
		HashMultimap<String, String> 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<String> 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<K>接口,实现这个几口的数据结构在保留set的其他功能基础上。能够存储多个相同的元素。平常我们使用的例如HashSet是不能存放多个相同元素的,即使多次add也只会保留一个。

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

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

static <K,V> Multimap<K,V>synchronizedMultimap(Multimap<K,V> multimap)
Returns a synchronized (thread-safe) multimap backed by the specified multimap.

static <K,V> ListMultimap<K,V>synchronizedListMultimap(ListMultimap<K,V> multimap)
Returns a synchronized (thread-safe) ListMultimap backed by the specified multimap.

static <K,V> Map<K,List<V>>asMap(ListMultimap<K,V> multimap)
Returns multimap.asMap(), with its type corrected from Map<K, Collection<V>> to Map<K, List<V>>.

static <K,V> Map<K,Collection<V>>asMap(Multimap<K,V> multimap)
Returns multimap.asMap().

static <K,V> ListMultimap<K,V>filterKeys(ListMultimap<K,V> unfiltered,Predicate<? super K> keyPredicate)
Returns a multimap containing the mappings in unfiltered whose keys satisfy a predicate

static <K,V> Multimap<K,V>filterKeys(Multimap<K,V> unfiltered,Predicate<? super K> keyPredicate)
Returns a multimap containing the mappings in unfiltered whose keys satisfy a predicate.

static <K,V> Multimap<K,V>filterValues(Multimap<K,V> unfiltered,Predicate<? super V> valuePredicate)
Returns a multimap containing the mappings in unfiltered whose values satisfy a predicate.






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值