Cómo transformar Lista a Mapa con colecciones de Google?


Tengo una lista de cadenas y una función para generar un valor para cada clave de la lista.

Quiero crear un mapa usando esta función. ¿Puedo hacer esto con Google collections?

Author: Matthias Braun, 2011-02-15

5 answers

A partir del 26/7/2012, Guava master contiene dos nuevas formas de hacer esto. Deberían estar en la versión 14.0.

Maps.asMap(Set<K>, Function<? super K, V>) (y dos sobrecargas para SortedSet y NavigableSet) le permite ver un Set más un Function como un Map donde el valor para cada clave en el conjunto es el resultado de aplicar la función a esa clave. El resultado es una vista, por lo que no copia el conjunto de entrada y el resultado Map cambiará como lo hace el conjunto y viceversa.

Maps.toMap(Iterable<K>, Function<? super K, V>) toma un Iterable y ansiosamente lo convierte en un ImmutableMap donde los distintos elementos del iterable son las claves y los valores son los resultados de aplicar la función a cada clave.

 23
Author: ColinD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-27 01:25:43

Utilice Mapas.uniqueIndex (Iterable, Función) :

Devuelve un mapa inmutable para el cual el Asignar.values() son los elementos dados en el orden dado, y cada clave es la producto de invocar un suministrado función en su valor correspondiente. (de javadoc)

Ejemplo:

Map<String,String> mappedRoles = Maps.uniqueIndex(yourList, new Function<String,String>() {
  public String apply(String from) {
    // do stuff here
    return result;
  }});
 86
Author: dogbane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-24 21:50:22

EDITAR: Es completamente posible que Sean tenga razón y yo malinterpreté la pregunta.

Si la lista original está destinada a ser teclas , entonces suena como que podría ser capaz de utilizar un mapa de computación, a través de MapMaker.makeComputingMap, e ignora la lista de entrada para empezar. EDITAR: Como se indica en los comentarios, esto ahora está obsoleto y eliminado en Guava 15.0. Echa un vistazo a CacheBuilder en su lugar.

Por otro lado, eso tampoco te da un mapa que te devolverá null si le pides un valor correspondiente a una clave que no estaba en la lista para empezar. Tampoco te dará En otras palabras, esto bien puede no ser apropiado, pero vale la pena considerarlo, dependiendo de lo que estés tratando de hacer con él. :)

Dejaré esta respuesta aquí a menos que comente que ninguno de los enfoques de aquí es útil para usted, en cuyo caso lo eliminaré.


Respuesta original

Usando Guayaba puedes hacer esto bastante fácilmente con Maps.uniqueIndex:

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

(Mencioné la guayaba específicamente en oposición a las colecciones de Google, ya que no he comprobado si el repositorio de colecciones de Google más antiguo incluye Maps.uniqueIndex.)

 15
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-29 10:34:14

O te he malinterpretado o los otros carteles lo han hecho. Entiendo que quieres que tu lista sea las claves del mapa, mientras Maps.uniqueIndex() crea claves para asignar a sus valores (que es todo lo contrario).

De todos modos, hay un problema de guayaba abierta que solicita la funcionalidad exacta que está solicitando, y también he implementado una solución de este tipo para una pregunta anterior.

 13
Author: Sean Patrick Floyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:31

Usando Guayaba + Lamba

 Map<String, YourCustomClass> map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());
 6
Author: Carlos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-29 09:19:04