【发布时间】:2021-05-31 21:29:16
【问题描述】:
我面临的实际问题是根据任意/灵活的Predicate<V> 过滤ListMultimap<K, V> 的值。
Predicate<Integer> filterCondition = i -> i > 42;
ListMultimap<String, Integer> myMap = MultimapBuilder.hashKeys().arrayListValues().build();
// populate myMap ...
// below does not work
myMap = Multimaps.filterValues(myMap, filterCondition);
最后一行不起作用,因为 Guava 没有在这里有用的 <K, V> ListMultimap<K, V> filterValues(ListMultimap<K, V> unfiltered, final Predicate<? super V> valuePredicate),即使它两者都有
-
public static <K,V> Multimap<K,V> filterValues(Multimap<K,V> unfiltered, Predicate<? super V> valuePredicate)和 -
public static <K,V> SetMultimap<K,V> filterValues(SetMultimap<K,V> unfiltered, Predicate<? super V> valuePredicate)。
为什么省略了?
我最终得到了以下解决方法,但这似乎不必要地复杂(并且可能效率低下)。
ListMultimap<String, Integer> myNewMap = MultimapBuilder.hashKeys().arrayListValues().build();
myMap.entries().stream().filter(e -> filterCondition.test(e.getValue()))
.forEach(e -> myNewMap.put(e.getKey(), e.getValue()));
myMap = myNewMap;
【问题讨论】: