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

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

Ответ 1

Начиная с 7/26/2012, мастер Guava содержит два новых способа сделать это. Они должны быть в выпуске 14.0.

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

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

Ответ 2

Используйте 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;
  }});

Ответ 3

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

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

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

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


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

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

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

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

Ответ 4

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

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

Ответ 5

Использование Guava + Lamba

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