Java 过滤Guava多重映射

Java 过滤Guava多重映射,java,guava,Java,Guava,是否有一个内置方法或方法组合,可以使用谓词返回Guava ImmutableMultimaps的过滤视图,就像使用常规映射一样 似乎没有接受ImmutableMultimap作为参数的Maps.filter方法。查看API,我可以调用asMap(),获得多重映射的基于映射的视图,并以这种方式执行过滤器。但是,我需要从函数返回一个ImmutableMultimap,并且由于明显的原因,没有一种方法可以将Map>视为一个ImmutableMultimap,而不必构造一个新的Multimap 即使我可

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

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

即使我可以将其作为一个映射进行过滤并将其转换回一个ImmutableMultimap,因为它们都只是视图(我想?),过滤方法也只允许我将集合作为一个整体进行过滤,而不删除单个值。

公共静态ImmutableMultimap dFilter(
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);
}
不可变的多重映射数据// 谓词// ) { Multimap result=HashMultimap.create(); 对于(类型1 t1:data.keys()) if(谓词apply(t1)) 对于(类型2 t2:data.get(t1)) 结果:put(t1,t2); 返回ImmutableMultimap.copyOf(结果); }
是否有内置方法…


没有。

经过思考,我认为没有一种方法可以创建不可变多重映射的过滤视图,这是有充分理由的。如果一个对象期望一个不可变的多重映射,那么它期望该对象在该对象的生命周期内不会发生变化。应用一个可以动态运行的过滤器将打破隐含的(或我所知的可能编写的)契约,因为在调用不同方法之间,映射实际上发生了变化。

而不是复制完整的不可变多映射,您可以尝试使用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);
}
@覆盖
公共布尔containsKey(@Nullable Object key){
如果(!keyFilter.apply(键))
返回false;
返回super.containsKey(键);
}
@凌驾
公共布尔containsEntry(@Nullable Object key,@Nullable Object value){
..
}
@凌驾
公共集合get(@Nullable K key){
如果(!keyFilter.apply(键))
返回集合。emptyList();
返回集合2.filter(委托().get(键),valueFilter);
}

依此类推。

在第11版中被添加到Guava中。

您是想过滤键还是值?我实际上需要过滤这两者。在一个例子中,一个是键,另一个是键和值。请参阅以获得一些想法。感谢提供代码片段。这基本上就是我最终要做的,但我使用了ImmutableMultiMap builder,因此我不必创建一个映射,然后将其重新创建为一个不可变映射。