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);