【问题标题】:How can I convert MultiMap<Integer, Foo> to Map<Integer, Set<Foo>> using Guava?如何使用 Guava 将 MultiMap<Integer, Foo> 转换为 Map<Integer, Set<Foo>>?
【发布时间】:2012-06-26 09:15:47
【问题描述】:

我正在使用来自 Google Guava 12 的 MultiMap,如下所示:

Multimap<Integer, OccupancyType> pkgPOP = HashMultimap.create();

在这个multimap中插入值后,我需要返回:

Map<Integer, Set<OccupancyType>>

但是,当我这样做时:

return pkgPOP.asMap();

它返回我

Map<Integer, Collection<OccupancyType>>

我怎样才能返回Map&lt;Integer, Set&lt;OccupancyType&gt;&gt;

【问题讨论】:

    标签: java set guava


    【解决方案1】:

    看看this issue and comment #2 by Kevin Bourrillion,Guava 开发负责人:

    您可以先将Map&lt;K, Collection&lt;V&gt;&gt; 双重转换为原始地图,然后 然后到你想要的Map&lt;K, Set&lt;V&gt;&gt;。你必须压制一个 未经检查的警告,您应该在那时发表评论,“安全,因为 SetMultimap 保证了这一点。” 我什至可以更新 SetMultimap javadoc 来提一下这个技巧。

    未经检查的演员也是如此:

    @SuppressWarnings("unchecked") // Safe because SetMultimap guarantees this.
    final Map<Integer, Set<OccupancyType>> mapOfSets = 
        (Map<Integer, Set<OccupancyType>>) (Map<?, ?>) pkgPOP.asMap();
    

    编辑:

    从 Guava 15.0 开始,您可以使用 helper method 以更优雅的方式执行此操作:

    Map<Integer, Set<OccupancyType>> mapOfSets = Multimaps.asMap(pkgPOP);
    

    【讨论】:

    • 我确信最右边的演员必须是普通的 Map,但也许这是由于我们不再关心的 javac 版本......不确定。跨度>
    【解决方案2】:

    Guava 贡献者在这里:

    做不安全的演员。会很安全的。

    由于 Java 继承的工作方式,它不能返回 Map&lt;K, Set&lt;V&gt;&gt;。本质上,Multimap 超类型必须返回 Map&lt;K, Collection&lt;V&gt;&gt;,并且因为 Map&lt;K, Set&lt;V&gt;&gt; 不是 Map&lt;K, Collection&lt;V&gt;&gt; 的子类型,所以您不能覆盖 asMap() 以返回 Map&lt;K, Set&lt;V&gt;&gt;

    【讨论】:

    • 路易斯,你根本不睡觉,是吗? ;)
    • 我对 (Set)MultiMap 使用什么实现有关系吗? (就我而言,我使用的是 HashMultiMap)。如果我使用这样的东西,一切都会崩溃:SetMultiMap mapOfSets = LinkedListMultiMap.create()
    • 好吧,LinkedListMultimapListMultimap,而不是 SetMultimap。只要您使用 some SetMultimap 实现,例如LinkedHashMultimapTreeMultimap,你很好。 (还有@Xaerxess,我整个夏天都在英国时间。)
    • @LouisWasserman 谢谢!您和 Xaerxess 的回复对我来说都是很好的答案。
    猜你喜欢
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多