是否有内置方法或方法组合使用谓词返回Guava ImmutableMultimaps的过滤视图,就像使用常规地图一样?
似乎没有Maps.filter方法接受ImmutableMultimap作为参数。查看API我可以调用asMap()并获取多图的基于地图的视图,并以这种方式执行过滤。但是,我需要从我的函数返回一个ImmutableMultimap,并且由于显而易见的原因,没有办法查看Map>作为ImmutableMultimap - 无需构建新的Multimap。
即使我可以将它过滤为Map并将其转换回ImmutableMultimap,因为它们都只是视图(我认为?),过滤器方法只允许我整个过滤集合而不删除单个值。
答案 0 :(得分:14)
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,它会期望该对象在该对象的生命周期内看起来不会改变。应用一个可以动态操作的过滤器,可以打破隐含的(或者可能是我所知道的所有)合同,因为看起来在调用各种方法之间,地图实际上已经发生了变异。