Ale*_*nov 33 java generics guava
如果我想用简单的默认值创建一个新的Multimap,我需要做类似的事情:
private final Multimap<Key, Value> providersToClasses = Multimaps
.newListMultimap(
new HashMap<Key, Collection<Value>>(),
new Supplier<List<Value>>() {
@Override
public List<Value> get() {
return Lists.newArrayList();
}
});
Run Code Online (Sandbox Code Playgroud)
因为如果Maps.newHashMap用于支持映射,Java无法推断出正确的类型.当然,这可以重构为一个单独的方法,但是有没有办法更简洁地编写它?
Dan*_*ply 55
你为什么不用ArrayListMultimap.create()这么简单的案子?这是创建简单HashMap/ArrayList的默认方式,它可能是最常用的多图.
Sam*_*rry 15
我在编写客户端和构建查询参数的映射时遇到了这个问题.我喜欢用于构建多地图的简洁模式ImmutableMultiMap#builder
Multimap<String, String> queryParams =
ImmutableMultimap.<String, String>builder()
.put("key-1", "value-1")
.put("key-1", "value-2")
.build();
Run Code Online (Sandbox Code Playgroud)
该番石榴文件指出,create一些其他的答案倡导的方法"很快就会被弃用"赞成下面介绍的不同形式,因此应尽量避免.
从Guava 21.0开始,创建一个Multimap存储在ArrayList集合中的值的对象的推荐方法如下:
MultimapBuilder.hashKeys().arrayListValues().build();
Run Code Online (Sandbox Code Playgroud)
如果要指定地图中预期的键数以及每个键的预期值数,也可以使用参数:
MultimapBuilder.hashKeys(expectedKeys).arrayListValues(expectedValuesPerKey).build();
Run Code Online (Sandbox Code Playgroud)
最后,您可以Multimap使用此构造从现有的创建新的:
MultimapBuilder.hashKeys().arrayListValues().build(multimap);
Run Code Online (Sandbox Code Playgroud)
如果您想使用除ArrayLists您之外的数据结构Multimap,您可以将呼叫替换为此处arrayListValues()列出的许多其他数据结构.
这是紧凑的解决方案:
Multimap<Integer, String> multi = HashMultimap.create();
Run Code Online (Sandbox Code Playgroud)