【问题标题】:Compact way to create Guava Multimaps?创建番石榴多图的紧凑方法?
【发布时间】:2012-05-17 14:12:03
【问题描述】:

如果我想用简单的默认值创建一个新的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 无法推断出正确的类型。当然,这可以重构为一个单独的方法,但是已经有办法写得更简洁了吗?

【问题讨论】:

    标签: java generics guava


    【解决方案1】:

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

    Guava 21.0 起,创建 Multimap 对象的推荐方法如下:

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

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

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

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

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

    如果您想在您的Multimap 中使用ArrayLists 以外的数据结构,您可以将arrayListValues() 的调用替换为here 列出的其他一些数据结构。

    【讨论】:

    • MultimapBuilder 自 27.0 起仍标记为 @Beta
    • 在 28.0/28.1 中它不是(但 create 仍然“将很快被弃用”)
    【解决方案2】:

    为什么不使用ArrayListMultimap.create() 来处理这种简单的情况?这是创建简单 HashMap/ArrayList 的默认方式,这可能是最常用的多映射。

    【讨论】:

    • 我想你的意思是ArrayListMultimapHashMultimap 代表HashMap/HashSet
    • 我们担心这个,所以我们把这个文档放在 newListMultimap() 上:“只有当更简单的方法 ArrayListMultimap.create() 和 LinkedListMultimap.create() 不够用时才调用这个方法。”
    • 嗨,@KevinBourrillion。对于有时非常简单的用例,强制使用该工厂参数会产生很多噪音。拥有简化版本会非常有用,例如 NewListMultimap(Map> map) 将使用一些默认工厂创建 multiMaps。我有很多来自 Jersey 的 MultivaluedMap 类可以转换为多图,并且转换代码使得代码很难阅读。
    • 从 21.0 版开始,文档声明此方法将被弃用,转而支持 MultimapBuilder.hashKeys().arrayListValues().build()
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      这是紧凑的解决方案:

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

      【讨论】:

        【解决方案5】:

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

        看起来像这样:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-24
            • 1970-01-01
            • 2012-04-13
            • 2013-01-16
            • 2012-06-04
            • 1970-01-01
            相关资源
            最近更新 更多