Как преобразовать Список <String>в Карту <String, String> с коллекциями Google? - PullRequest
51 голосов
/ 15 февраля 2011

У меня есть список строк, и у меня есть функция для генерации значения для каждого ключа в списке.

Я хочу создать карту с помощью этой функции.Могу ли я сделать это с коллекциями Google?

Ответы [ 5 ]

87 голосов
/ 15 февраля 2011

Использование Maps.uniqueIndex (Итерируемый, Функция) :

Возвращает неизменную карту, для которой Map.values ​​() являются заданными элементами в заданный порядок, и каждый ключ является продукт вызова поставляемого функция с соответствующим значением. (из javadoc)

Пример:

Map<String,String> mappedRoles = Maps.uniqueIndex(yourList, new Function<String,String>() {
  public String apply(String from) {
    // do stuff here
    return result;
  }});
23 голосов
/ 27 июля 2012

По состоянию на 26.07.2012, мастер Guava содержит два новых способа сделать это.Они должны быть в версии 14.0.

Maps.asMap(Set<K>, Function<? super K, V>) (и две перегрузки для SortedSet и NavigableSet) позволяет просматривать Set плюс Function как Map, где значениедля каждой клавиши в наборе есть результат применения функции к этой клавише.Результатом является представление, поэтому он не копирует входной набор, и результат Map изменится, как и набор, и наоборот.

Maps.toMap(Iterable<K>, Function<? super K, V>) берет Iterable и с готовностью преобразует его вImmutableMap, где различные элементы итерируемого - это ключи, а значения - это результаты применения функции к каждому ключу.

15 голосов
/ 15 февраля 2011

РЕДАКТИРОВАТЬ: Вполне возможно, что Шон прав, и я неправильно понял вопрос.

Если исходный список предназначен для ключей , то звучит так, как будто вы можете просто использовать вычислительную карту через MapMaker.makeComputingMap и игнорировать список ввода начать с. РЕДАКТИРОВАТЬ: Как отмечено в комментариях, теперь это устарело и удалено в Гуаве 15.0. Взгляните вместо этого CacheBuilder.

С другой стороны, это также не дает вам карту, которая будет возвращать ноль, если вы спросите ее о значении, соответствующем ключу, которого не было в списке для начала. Это также не даст вам Иными словами, это может не быть уместным, но это стоит рассмотреть, в зависимости от того, что вы пытаетесь с ним делать. :)

Я оставлю этот ответ здесь, если вы не прокомментируете, что ни подход здесь не пригодится вам, в этом случае я его удалю.


Оригинальный ответ

Используя Guava , вы можете сделать это довольно легко с помощью Maps.uniqueIndex:

Map<String, String> map = Maps.uniqueIndex(list, keyProjection);

(я упомянул Guava специально, в отличие от коллекций Google, поскольку я не проверял, содержит ли более старый репозиторий коллекций Google Maps.uniqueIndex.)

13 голосов
/ 15 февраля 2011

Либо я вас неправильно понял, либо другие постеры.Я понимаю, что вы хотите, чтобы в вашем списке были ключи карты, а Maps.uniqueIndex() создает ключи для сопоставления с вашими значениями (что совсем наоборот).

В любом случае, есть откройте вопрос о Гуаве , который запрашивает точную функциональность, которую вы запрашиваете, и я также реализовал такое решение для предыдущего вопроса.

6 голосов
/ 29 октября 2014

Использование гуавы + ламба

 Map<String, YourCustomClass> map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...