Мне трудно найти конструктора для создания Multimap
. Мой код:
Multimap<String, DbEntity> multimapByKey = Multimaps.index(goodHosts, instanceGetKeyfunction);
...
multimapByKey.removeAll(someKey);
// throws
// java.lang.UnsupportedOperationException
// at com.google.common.collect.ImmutableListMultimap.removeAll(Unknown Source)
// at com.google.common.collect.ImmutableListMultimap.removeAll(Unknown Source)
Поскольку индекс возвращает ImmutableListMultimap
я действительно не могу его изменить. Тем не менее, я не вижу других вариантов, чтобы делать group by keyFunction for Multimaps в официальной документации.
Вы можете создать метод, который возвращает изменчивый Multimap
, например индексную функцию, например:
public static <K, V> Multimap<K, V> indexMutable(Iterable<V> values,
Function<? super V, K> function) {
// check null value, function
Multimap<K, V> map = ArrayListMultimap.create();
for (V v : values) {
// check null V
map.put(function.apply(v), v);
}
return map;
}
И используйте вот так:
@Test
public void testMutableMap() throws Exception {
List<String> badGuys = Arrays.asList("Inky", "Blinky", "Pinky",
"Pinky", "Clyde");
Function<String, Integer> stringLengthFunction = new Function<String, Integer>() {
public Integer apply(String input) {
return input.length();
}
};
Multimap<Integer, String> multipmap = indexMutable(badGuys,
stringLengthFunction);
System.out.println(multipmap);
multipmap.clear();
System.out.println("It mutable!");
for (String guy : badGuys) {
multipmap.get(stringLengthFunction.apply(guy)).add(guy);
}
System.out.println(multipmap);
}
Он выводит:
{4=[Inky], 5=[Pinky, Pinky, Clyde], 6=[Blinky]}
It mutable!
{4=[Inky], 5=[Pinky, Pinky, Clyde], 6=[Blinky]}
Этот пример является тем же самым для Multimaps#index
Javadoc of Multimaps#index
.