Почему 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}