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

时间:2012-05-17 14:12:04

标签: 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();
                    }
                });

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

6 个答案:

答案 0 :(得分:54)

为什么不将ArrayListMultimap.create()用于这样一个简单的案例?这是创建简单HashMap / ArrayList的默认方式,可能是最常用的多图。

答案 1 :(得分:14)

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

Multimap<String, String> queryParams = 
  ImmutableMultimap.<String, String>builder()
    .put("key-1", "value-1")
    .put("key-1", "value-2")
    .build();

答案 2 :(得分:9)

Guava documentation指出,其他一些答案提倡的create方法&#34;很快就会被弃用&#34; ,支持下面列出的不同表格,因此应该避免。

Guava 21.0开始,创建Multimap对象的建议方法是将值存储在ArrayList个集合中,如下所示:

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

如果要指定地图中预期的键数以及每个键的预期值数,也可以使用参数:

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

最后,您可以使用此构造从现有的Multimap创建新的MultimapBuilder.hashKeys().arrayListValues().build(multimap);

ArrayLists

如果您想在Multimap中使用arrayListValues()以外的数据结构,则可以将0, 1, 2, 3, etc.的号码替换为here列出的其他号码$array = array( array("FIRST_NAME" => "Jon", "LAST_NAME" => "Doe"), array("FIRST_NAME" => "Jane", "LAST_NAME" => "Doe"), array("FIRST_NAME" => "Johnny", "LAST_NAME" => "Doe"), array("FIRST_NAME" => "Janie", "LAST_NAME" => "Doe")); $output = ""; foreach ($array as $i => $values) { // get the inner arrays from the outer array if ($i != 0) { // check if it is not the first array $output .= ", {$values['FIRST_NAME']} {$values['LAST_NAME']}"; } else { $output .= "{$values['FIRST_NAME']} {$values['LAST_NAME']}"; } } echo $output; // Jon Doe, Jane Doe, Johnny Doe, Janie Doe

答案 3 :(得分:4)

在Java 8中,对于所有类型的多图,这都好得多。这有两个原因:

看起来像这样:

Multimap<Key, Value> providersToClasses =
    Multimaps.newListMultimap(new HashMap<>(), ArrayList::new);

答案 4 :(得分:4)

这是紧凑的解决方案:

Multimap<Integer, String> multi = HashMultimap.create();

答案 5 :(得分:2)

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