过滤番石榴Multimaps

时间:2011-06-04 00:00:20

标签: java guava

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

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

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

4 个答案:

答案 0 :(得分:14)

在第11版中,

Multimaps.filterEntries被添加到Guava中。

答案 1 :(得分:4)

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

@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);
}

等等。

答案 2 :(得分:1)

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);
}

是否有内置方法......

没有

答案 3 :(得分:0)

经过反思,我认为有一种方法可以创建一个ImmutableMultimap的过滤视图,原因很简单。如果一个对象需要一个ImmutableMultiMap,它会期望该对象在该对象的生命周期内看起来不会改变。应用一个可以动态操作的过滤器,可以打破隐含的(或者可能是我所知道的所有)合同,因为看起来在调用各种方法之间,地图实际上已经发生了变异。