it-swarm-ru.tech

Как преобразовать список <String> в карту <String, String> с коллекциями Google?

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

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

51
oshai

По состоянию на 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, где различные элементы итерируемого являются ключами, а значения являются результатами применения функции к каждому ключу.

23
ColinD

Используйте Maps.uniqueIndex (Iterable, Function) :

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

Пример:

Map<String,String> mappedRoles = Maps.uniqueIndex(yourList, new Function<String,String>() {
  public String apply(String from) {
    // do stuff here
    return result;
  }});
87
dogbane

Правка: Вполне возможно, что Шон прав, и я неправильно понял вопрос.

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

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

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


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

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

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

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

15
Jon Skeet

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

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

13
Sean Patrick Floyd

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

 Map<String, YourCustomClass> map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());
6
Carlos