У меня есть список со строками, и у меня есть функции для генерации значения для каждого ключа в списке, и я хочу создать карту с помощью метода. есть ли такая функция в коллекциях google?
Как преобразовать List <String> в Map <String, String> с коллекциями 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());