Подтвердить что ты не робот

Фильтрация мультикапов Guava

Есть ли встроенный метод или комбинация методов для возврата отфильтрованного представления Guava ImmutableMultimaps с использованием предикатов, например, с помощью обычных карт?

Не существует метода Maps.filter, который принимает параметр ImmutableMultimap в качестве параметра. Глядя на API, я мог бы вызвать asMap() и получить представление на основе карты мультимапа и выполнить фильтр таким образом. Однако мне нужно вернуть ImmutableMultimap из моей функции, и по очевидным причинам нет возможности просматривать Map > как ImmutableMultimap - без необходимости создавать новый Multimap.

Даже если бы я мог отфильтровать его как карту и вернуть ее обратно в ImmutableMultimap, поскольку все они являются просто представлениями (я думаю?), методы фильтрации позволили бы мне фильтровать в коллекции в целом, не удаляя отдельные значения.

4b9b3361

Ответ 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);
}

Есть ли встроенный метод...

Нет.

Ответ 4

При отражении я не думаю, что есть способ создать отфильтрованный вид ImmutableMultimap по очень веской причине. Если объект ожидает ImmutableMultiMap, он ожидает, что объект не изменится на время жизни объекта. Применение фильтра, который мог бы работать динамически, нарушил бы подразумеваемый (или возможно написанный для всех, кого я знаю) договор, поскольку казалось бы, что между вызовами различных методов карта фактически мутировалась.