紧凑的方式来创建番石榴Multimaps?

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的默认方式,它可能是最常用的多图.

  • 我们对此感到担心,所以我们把这个doc放在newListMultimap()上:"只有当简单的方法ArrayListMultimap.create()和LinkedListMultimap.create()不够时才调用这个方法." (14认同)
  • 因为我在找错了类(`Multimaps`):) (3认同)
  • 我认为你的意思是'ArrayListMultimap`.`HashMultimap`用于`HashMap` /`HashSet`. (2认同)
  • 从 21.0 版本开始,文档指出此方法将被弃用,取而代之的是 ```MultimapBuilder.hashKeys().arrayListValues().build()```。 (2认同)

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)


Pyv*_*ves 9

番石榴文件指出,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()列出的许多其他数据结构.


Але*_*нко 6

这是紧凑的解决方案:

Multimap<Integer, String> multi = HashMultimap.create();
Run Code Online (Sandbox Code Playgroud)