tl; dr
Use Map.of…
métodos no Java 9 e posterior.
Map< String , String > animalSounds =
Map.of(
"dog" , "bark" , // key , value
"cat" , "meow" , // key , value
"bird" , "chirp" // key , value
)
;
Map.of
O Java 9 adicionou uma série de Map.of
métodos estáticos para fazer exatamente o que você deseja: Instancie um imutável Map
usando a sintaxe literal .
O mapa (uma coleção de entradas) é imutável, portanto você não pode adicionar ou remover entradas após instanciar. Além disso, a chave e o valor de cada entrada são imutáveis, não podem ser alterados. Consulte o Javadoc para outras regras, como NULLs não permitidos, chaves duplicadas não permitidas e a ordem de iteração dos mapeamentos é arbitrária.
Vejamos esses métodos, usando alguns dados de amostra para um mapa do dia da semana para uma pessoa que esperamos que funcione nesse dia.
Person alice = new Person( "Alice" );
Person bob = new Person( "Bob" );
Person carol = new Person( "Carol" );
Map.of()
Map.of
cria um vazio Map
. Não modificável, então você não pode adicionar entradas. Aqui está um exemplo desse mapa, vazio sem entradas.
Map < DayOfWeek, Person > dailyWorkerEmpty = Map.of();
dailyWorkerEmpty.toString (): {}
Map.of( … )
Map.of( k , v , k , v , …)
Existem vários métodos que levam de 1 a 10 pares de valores-chave. Aqui está um exemplo de duas entradas.
Map < DayOfWeek, Person > weekendWorker =
Map.of(
DayOfWeek.SATURDAY , alice , // key , value
DayOfWeek.SUNDAY , bob // key , value
)
;
weekendWorker.toString (): {DOMINGO = Pessoa {nome = 'Bob'}, SÁBADO = Pessoa {nome = 'Alice'}}
Map.ofEntries( … )
Map.ofEntries( Map.Entry , … )
leva qualquer número de objetos implementando a Map.Entry
interface. O Java agrupa duas classes implementando essa interface, uma mutável e a outra imutável: AbstractMap.SimpleEntry
, AbstractMap.SimpleImmutableEntry
. Mas não precisamos especificar uma classe concreta. Nós apenas precisamos chamar Map.entry( k , v )
método, passar nossa chave e nosso valor e retornar um objeto de uma Map.Entry
interface de implementação de alguma classe .
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 )
);
weekdayWorker.toString (): {QUARTA-FEIRA = Pessoa {nome = 'Bob'}, TERÇA-FEIRA = Pessoa {nome = 'Bob'}, QUINTA-FEIRA = Pessoa {nome = 'Carol'}, SEXTA-FEIRA = Pessoa {nome = 'Carol'} , SEGUNDA-FEIRA = Pessoa {name = 'Alice'}}
Map.copyOf
O Java 10 adicionou o método Map.copyOf
. Passe um mapa existente, receba de volta uma cópia imutável desse mapa.
Notas
Observe que a ordem do iterador dos mapas produzidos via nãoMap.of
é garantida. As entradas têm uma ordem arbitrária. Não escreva código com base no pedido visto, pois a documentação avisa que o pedido está sujeito a alterações.
Observe que todos esses Map.of…
métodos retornam um Map
de uma classe não especificada . A classe concreta subjacente pode até variar de uma versão do Java para outra. Esse anonimato permite que o Java escolha entre várias implementações, o que for melhor para seus dados específicos. Por exemplo, se suas chaves vierem de uma enumeração , o Java pode usar uma EnumMap
sob as cobertas.