【问题标题】:Filtering Guava Multimaps过滤 Guava Multimap
【发布时间】:2011-09-08 04:35:07
【问题描述】:

是否有内置方法或方法组合使用谓词返回 Guava ImmutableMultimaps 的过滤视图,就像使用常规地图一样?

似乎没有接受 ImmutableMultimap 作为参数的 Maps.filter 方法。查看 API,我可以调用 asMap() 并获取基于地图的多地图视图并以这种方式执行过滤器。但是,我需要从我的函数中返回一个 ImmutableMultimap,并且由于显而易见的原因,没有办法将 Map> 视为 ImmutableMultimap - 而不必构造一个新的 Multimap。

即使我可以将其过滤为 Map 并将其转换回 ImmutableMultimap,因为它们都只是视图(我认为?),过滤器方法只会让我过滤整个集合,而不是删除单个值。

【问题讨论】:

  • 您是要过滤键还是值?
  • 我实际上需要过滤两者。在一种情况下只是在键上,在另一种情况下是键和值。
  • 请参阅stackoverflow.com/questions/6176918/… 以获得一些想法。

标签: java guava


【解决方案1】:

Multimaps.filterEntries 在第 11 版中添加到 Guava。

【讨论】:

    【解决方案2】:

    您可以尝试使用 ForwardingMultimap 并在查询地图时应用过滤器,而不是复制完整的不可变多图,例如

    @Override
    public boolean containsKey(@Nullable Object key) {
      if (!keyFilter.apply(key))
        return false;
      return super.containsKey(key);
    }
    
    @Override
    public boolean containsEntry(@Nullable Object key, @Nullable Object value) {
      ..
    }
    
    @Override
    public Collection<V> get(@Nullable K key) {
      if (!keyFilter.apply(key))
        return Collections.emptyList();
      return Collections2.filter(delegate().get(key), valueFilter);
    }
    

    等等。

    【讨论】:

      【解决方案3】:
      public static <Type1, Type2> ImmutableMultimap<Type1, Type2> dFilter(
              ImmutableMultimap<Type1, Type2> data,//
              Predicate<Type1> predicate//
      ) {
          Multimap<Type1, Type2> result = HashMultimap.create();
          for (Type1 t1 : data.keys())
              if (predicate.apply(t1))
                  for (Type2 t2 : data.get(t1))
                      result.put(t1, t2);
      
          return ImmutableMultimap.copyOf(result);
      }
      

      有没有内置方法...

      没有。

      【讨论】:

      • 感谢代码 sn-p。这基本上就是我最终要做的事情,但我使用了 ImmutableMultiMap 构建器,因此我不必创建 Map 然后将其重新创建为不可变地图。
      【解决方案4】:

      经过反思,我认为没有一种方法可以创建 ImmutableMultimap 的过滤视图,这是有充分理由的。如果一个对象需要一个 ImmutableMultiMap,它会期望该对象在对象的生命周期内不会出现变化。应用一个可以动态操作的过滤器会破坏隐含的(或据我所知可能是书面的)契约,因为在调用各种方法之间,映射实际上已经发生了变化。

      【讨论】:

        猜你喜欢
        • 2015-04-30
        • 1970-01-01
        • 1970-01-01
        • 2011-12-30
        • 2010-12-07
        • 2012-10-28
        • 2019-01-02
        • 2019-05-03
        • 1970-01-01
        相关资源
        最近更新 更多