40

如果我想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();
                    }
                });

Maps.newHashMap...因为如果用于支持映射,Java 无法推断出正确的类型。当然,这可以重构为一个单独的方法,但是有没有办法写得更简洁呢?

4

6 回答 6

58

ArrayListMultimap.create()这么简单的案子为什么不用呢?这是创建简单 HashMap/ArrayList 的默认方法,这可能是最常用的多图。

于 2012-05-17T14:25:36.087 回答
20

我在编写客户端和构建查询参数映射时遇到了这个问题。我喜欢构建多地图的一个简洁的模式是使用ImmutableMultiMap#builder

Multimap<String, String> queryParams = 
  ImmutableMultimap.<String, String>builder()
    .put("key-1", "value-1")
    .put("key-1", "value-2")
    .build();
于 2016-08-05T19:14:24.660 回答
15

Guava 文档指出,create其他一些答案所倡导的方法“将很快被弃用”,有利于下面介绍的不同形式,因此应该避免。

Guava 21.0 开始,推荐的创建Multimap值存储在ArrayList集合中的对象的方法如下:

MultimapBuilder.hashKeys().arrayListValues().build();

如果要指定映射中的预期键数和每个键的预期值数,还可以使用参数:

MultimapBuilder.hashKeys(expectedKeys).arrayListValues(expectedValuesPerKey).build();

最后,您可以Multimap使用以下构造从现有的创建一个新的:

MultimapBuilder.hashKeys().arrayListValues().build(multimap);

如果你想使用你的数据结构以外ArrayLists的数据结构Multimap,你可以用其他一些数据结构替换调用,这里arrayListValues()列出。

于 2017-05-14T12:15:30.213 回答
6

这是紧凑的解决方案:

Multimap<Integer, String> multi = HashMultimap.create();
于 2016-10-28T05:44:23.237 回答
4

在 Java 8 中,这对于各种多图来说要好得多。这有两个原因:

它看起来像这样:

Multimap<Key, Value> providersToClasses =
    Multimaps.newListMultimap(new HashMap<>(), ArrayList::new);
于 2016-09-16T08:22:50.487 回答
2

不过,要回答原始类型推断问题,您还可以使用 指定静态方法上的泛型类型Maps.<Key, Collection<Value>>newHashMap(),但肯定不会比new HashMap<Key, Collection<Value>>()(它可能更一致)更简洁。

于 2012-05-21T09:13:02.687 回答