我是靠谱客的博主 时尚过客,最近开发中收集的这篇文章主要介绍Guava-Multimap,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Multimap

参考

multimap

工作中频繁的要实现Map

a -> 1
a -> 2
b -> 3
  • 可将其视为单值key到一个collection,正如:
a -> [1, 2, 4]
b -> [3]
c -> [5]

其中第一种的理解更恰当,下面的分析基于此。

Construction

最常使用的是ListMultimapSetMultimap, keys分别map到ListSet

Construction

创建Multimap最直接的方法是用MultimapBuilder,可以直接配置keys和values的形式:

// creates a ListMultimap with tree keys and array list values
ListMultimap<String, Integer> treeListMultimap =
MultimapBuilder.treeKeys().arrayListValues().build();
// creates a SetMultimap with hash keys and enum set values
SetMultimap<Integer, MyEnum> hashEnumMultimap =
MultimapBuilder.hashKeys().enumSetValues(MyEnum.class).build();

也可以用实现类的create()方法,相比更推荐使用MultimapBuilder

Modifying

[Multimap.get(key)](http://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/Multimap.html#get-K-) 返回响应key的values的一个view。对于ListMultimap返回List,对于SetMultimap返回Set
修改Multimap:

Set<Person> aliceChildren = childrenMultimap.get(alice);
aliceChildren.clear();
aliceChildren.add(bob);
aliceChildren.add(carol);

其他修改方法

SignatureDescriptionEquivalent
put(K,V)添加一个valuemultimap.get(key).add(value)
putAll(K, Iterable)在key下放入每个valuesIterables.addAll(multimap.get(key), values)
remove(K, V)从key下移除一个valuemultimap.get(key).remove(value)
removeAll(K)Removes all values associated with the key key.Once this method returns, key will not be mapped to any values, so it will not appear in keySet(), asMap(), or any other views.multimap.get(key).clear()
replaceValues(K, Iterable)multimap.get(key).clear(); Iterables.addAll(multimap.get(key), values)

Views

支持一些很有用的views:

  • asMap 将Multimap<K, V>视为Map<K, Collection<V>>,返回这个Map支持remove,可以修改返回的这个map,但不支持putputAll。对于不存在key asMap().get(key)将返回null。不可将asMap.get(key)的返回值cast成为对于Set–>SetMultimap,对于List–>ListMulitmap,不支持从ListMultimap到Map

Multimap Is Not A Map

  • Multimap.get(key) 返回non-null,可能是一个空的collection,为了让我们可以放入我们想放入的值
  • 如果更想像Map 一样,返回null,使用asMap 返回一个Map<K, Collection<V>>
  • Multimap.containsKey(key) 只有在该key确实有对应的values时才返回true
  • Multimap.entries() 返回Multimap的所有keys的entries,如果想返回所有key-collection entries,使用asMap.entrySet()
  • Multimap.size() 返回所有entries的数,不是keys去重数,若需要,使用Multimap.keySet().size()返回keys去重数

Implementations

提供很多实现类,在使用Map<K, Collection<V>>的场景中选择使用

ImplementationKeys behave like…Values behave like..
ArrayListMultimapHashMapArrayList
HashMultimapHashMapHashSet
LinkedListMultimap *LinkedHashMap“*LinkedList“*
LinkedHashMultimap**LinkedHashMapLinkedHashSet
TreeMultimapTreeMapTreeSet
ImmutableListMultimapImmutableMapImmutableList
ImmutableSetMultimapImmutableMapImmutableSet

除了immutable实现,其他实现支持null keys和values
* LinkedListMultimap.entries() 保留non-distinct key values的迭代顺序
** LinkedHashMultimap 保留keys 和values的插入顺序

API

更多信息见API

应用示例

package com.learn.google.guava.ImmutableCollections;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.MultimapBuilder;
import com.google.common.collect.Multiset;
import java.util.Map;
public class MultimapTest {
public static void main(String[] args) {
ListMultimap<String, String> hashArrayListMultimap = MultimapBuilder.hashKeys().arrayListValues().build();
hashArrayListMultimap.put("beijing","haidian");
hashArrayListMultimap.put("beijing","chaoyang");
hashArrayListMultimap.put("shannxi","xi'an");
for (Map.Entry<String, String> entry : hashArrayListMultimap.entries()) {
System.out.println("key = " + entry.getKey() + "--->" + "value=" + entry.getValue() );
}
Multiset<String>
keys = hashArrayListMultimap.keys();
System.out.print("nkeys[");
for (String key : keys) {
System.out.print(key + " ");
}
System.out.println("]");
//输出:
//key = shannxi--->value=xi'an
//key = beijing--->value=haidian
//key = beijing--->value=chaoyang
//keys[shannxi beijing beijing ]
}
}

最后

以上就是时尚过客为你收集整理的Guava-Multimap的全部内容,希望文章能够帮你解决Guava-Multimap所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部