tl; dr
Use Map.of…
métodos en Java 9 y posteriores.
Map< String , String > animalSounds =
Map.of(
"dog" , "bark" , // key , value
"cat" , "meow" , // key , value
"bird" , "chirp" // key , value
)
;
Map.of
Java 9 agregó una serie de Map.of
métodos estáticos para hacer exactamente lo que desea: crear una instancia de inmutable Map
usando sintaxis literal .
El mapa (una colección de entradas) es inmutable, por lo que no puede agregar o quitar entradas después de crear instancias. Además, la clave y el valor de cada entrada son inmutables, no se pueden cambiar. Ver el Javadoc para ver otras reglas, como no se permiten NULL, no se permiten claves duplicadas y el orden de iteración de las asignaciones es arbitrario.
Veamos estos métodos, utilizando algunos datos de muestra para un mapa del día de la semana a una persona que esperamos que trabaje ese día.
Person alice = new Person( "Alice" );
Person bob = new Person( "Bob" );
Person carol = new Person( "Carol" );
Map.of()
Map.of
crea un vacio Map
. Inmodificable, por lo que no puede agregar entradas. Aquí hay un ejemplo de dicho mapa, vacío sin entradas.
Map < DayOfWeek, Person > dailyWorkerEmpty = Map.of();
dailyWorkerEmpty.toString (): {}
Map.of( … )
Map.of( k , v , k , v , …)
Hay varios métodos que toman de 1 a 10 pares clave-valor. Aquí hay un ejemplo de dos entradas.
Map < DayOfWeek, Person > weekendWorker =
Map.of(
DayOfWeek.SATURDAY , alice , // key , value
DayOfWeek.SUNDAY , bob // key , value
)
;
weekendWorker.toString (): {DOMINGO = Persona {nombre = 'Bob'}, SÁBADO = Persona {nombre = 'Alicia'}}
Map.ofEntries( … )
Map.ofEntries( Map.Entry , … )
toma cualquier número de objetos que implementan la Map.Entry
interfaz. Java agrupa dos clases que implementan esa interfaz, una mutable, la otra inmutable: AbstractMap.SimpleEntry
, AbstractMap.SimpleImmutableEntry
. Pero no necesitamos especificar una clase concreta. Simplemente necesitamos llamarMap.entry( k , v )
método, pasar nuestra clave y nuestro valor, y recuperamos un objeto de una Map.Entry
interfaz de implementación de alguna clase .
Map < DayOfWeek, Person > weekdayWorker = Map.ofEntries(
Map.entry( DayOfWeek.MONDAY , alice ) , // Call to `Map.entry` method returns an object implementing `Map.Entry`.
Map.entry( DayOfWeek.TUESDAY , bob ) ,
Map.entry( DayOfWeek.WEDNESDAY , bob ) ,
Map.entry( DayOfWeek.THURSDAY , carol ) ,
Map.entry( DayOfWeek.FRIDAY , carol )
);
día laborable.toString (): {MIÉRCOLES = Persona {nombre = 'Bob'}, MARTES = Persona {nombre = 'Bob'}, JUEVES = Persona {nombre = 'Carol'}, VIERNES = Persona {nombre = 'Carol'} , LUNES = Persona {nombre = 'Alicia'}}
Map.copyOf
Java 10 agregó el método Map.copyOf
. Pase un mapa existente, recupere una copia inmutable de ese mapa.
Notas
Tenga en cuenta que el orden de los mapas iterador produce a través de Map.of
son no garantizado. Las entradas tienen un orden arbitrario. No escriba código basado en el orden visto, ya que la documentación advierte que el pedido está sujeto a cambios.
Tenga en cuenta que todos estos Map.of…
métodos devuelven un Map
de una clase no especificada . La clase concreta subyacente puede incluso variar de una versión de Java a otra. Este anonimato permite a Java elegir entre varias implementaciones, lo que mejor se adapte a sus datos particulares. Por ejemplo, si sus claves provienen de una enumeración , Java podría usar una EnumMap
debajo de las cubiertas.