Почему guava Multimap.values ​​() возвращает плоскую коллекцию, а не коллекцию коллекций?

Мне очень нравится Multimap класс библиотеки goava goava. Это тип карты, где вы можете добавить несколько значений для ключа, поэтому он эффективно отображает из ключа в коллекцию некоторого типа. Особенно мне нравится функция Multimaps.index(), которая принимает Iterable и ключевую функцию и возвращает Multimap, какие группы (или индексы или карты) элементы Iterable по значению, возвращаемому функцией для каждого из этих элементов.

Я немного странно понимаю, что Multimap.values() возвращает плоскую коллекцию, а не коллекцию коллекций? Таким образом, группировка функции индекса дала мне потеряться, как только Ì получить значения. Я могу обойти эту проблему, вызвав Multimap.asMap(), а затем вызовет на ней значения().

Кто-нибудь знает, почему может иметь смысл, что Multimap ведет себя таким образом?

Ответ 1

Multimap.asMap().values() не является решением проблемы - было преднамеренно, что Multimap предоставляет оба способа доступа к нему, получая Collection<Collection<V>> через asMap().values() и получая сплющенный Collection<V> с values().

В более общем плане Multimap старается не просто "отображать в коллекции", а скорее "общий способ связывания ключей с несколькими значениями". Таким образом, вы получаете метод entries() в дополнение к values() и keys(). Представление asMap() обеспечивает способ рассматривать его как "карту для коллекций", но имеет очень разную семантику, которая не всегда является тем, что вы ищете.

В любом случае метод values предназначен только для заполнения другой ниши, чем тот, который заполняется asMap().values().

Ответ 2

Кто-нибудь знает, почему может иметь смысл, что Multimap ведет себя таким образом?

Multimap следует рассматривать как обычную карту, где ключи не обязательно должны быть уникальными.

Key       Val
 a   ->    1
 b   ->    2
 a   ->    3

Values: {1, 2, 3}