Java 创建Guava多重贴图的紧凑方法?
如果我想用简单的默认值创建一个新的Java 创建Guava多重贴图的紧凑方法?,java,generics,guava,Java,Generics,Guava,如果我想用简单的默认值创建一个新的Multimap,我现在需要执行以下操作: private final Multimap<Key, Value> providersToClasses = Multimaps .newListMultimap( new HashMap<Key, Collection<Value>>(), new Supplier<List<Value&
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();
}
});
private final Multimap provider stoclass=Multimap
.newListMultimap(
新建HashMap(),
新供应商(){
@凌驾
公共列表get(){
返回列表。newArrayList();
}
});
…因为如果
映射,Java无法推断正确的类型。newHashMap
用于支持映射。当然,这可以重构为一个单独的方法,但是已经有一种方法可以更简洁地编写它了吗?为什么不在这样一个简单的情况下使用它呢?这是创建简单HashMap/ArrayList的默认方法,它可能是最常用的多重映射。要回答原始类型推断问题,您也可以使用Maps.newHashMap()
在静态方法上指定泛型类型,但它肯定不会比newHashMap()更简洁。
(可能更一致)。我在编写客户端和构建查询参数的映射时遇到了这个问题。我喜欢使用一种简洁的模式来构建多映射
多映射查询参数=
ImmutableMultimap.builder()
.put(“键-1”、“值-1”)
.put(“键1”、“值2”)
.build();
在Java 8中,对于所有类型的多重映射,这一点要好得多。这有两个原因:
- 由于编译器使用,因此不必为
构造函数提供显式类型参数HashMap
- 可用于创建
工厂ArrayList
Multimap<Key, Value> providersToClasses =
Multimaps.newListMultimap(new HashMap<>(), ArrayList::new);
Multimap ProvidersToClass=
newListMultimap(newHashMap(),ArrayList::new);
这是一个紧凑的解决方案:
Multimap<Integer, String> multi = HashMultimap.create();
Multimap multi=HashMultimap.create();
声明,其他一些答案所提倡的创建方法将很快被弃用“而采用以下不同形式,因此应避免使用
从Guava 21.0开始,创建Multimap
对象(其中值存储在ArrayList
集合中)的推荐方法如下:
MultimapBuilder.hashKeys().arrayListValues().build();
如果要指定地图中的预期键数和每个键的预期值数,也可以使用参数:
MultimapBuilder.hashKeys(expectedKeys).arrayListValues(expectedValuesPerKey).build();
最后,您可以使用以下构造从现有映射创建新的多映射
:
MultimapBuilder.hashKeys().arrayListValues().build(multimap);
如果要在Multimap
中使用非ArrayLists
的数据结构,可以替换对arrayListValues()的调用
由许多其他的方法列出。我想你的意思是ArrayListMultimap
HashMultimap
用于HashMap
/HashSet
。我们很关心这个问题,所以我们把这个文档放在newListMultimap()上:“只有在使用更简单的方法ArrayListMultimap.create()和LinkedListMultimap.create()时才调用这个方法。”“嗨,@KevinBourrillion。强制使用工厂参数有时会对非常简单的用例产生很多干扰。有简化版本,比如NewListMultimap(映射映射)会非常有用吗?”这将使用一些默认工厂创建多重映射。我有来自Jersey的lot的多值Map类要转换为多重映射,转换代码使得读取代码变得非常困难。从21.0版开始,文档说明此方法将被弃用,取而代之的是MultimapBuilder.hashKeys().arrayListValues().build()
MultimapBuilder
从27.0开始仍然标记为@Beta
。在28.0/28.1中,它不是(但是create
仍然“将很快被弃用”)
MultimapBuilder.hashKeys().arrayListValues().build(multimap);