tl; dr
Utilizzare i Map.of…
metodi in Java 9 e versioni successive.
Map< String , String > animalSounds =
Map.of(
"dog" , "bark" , // key , value
"cat" , "meow" , // key , value
"bird" , "chirp" // key , value
)
;
Map.of
Java 9 ha aggiunto una serie di Map.of
metodi statici per fare esattamente quello che vuoi: creare un'istanza immutabile Map
usando la sintassi letterale .
La mappa (una raccolta di voci) è immutabile, quindi non è possibile aggiungere o rimuovere voci dopo l'istanza. Inoltre, la chiave e il valore di ciascuna voce sono immutabili, non possono essere modificati. Vedi Javadoc per altre regole, come nessun NULL consentito, nessuna chiave duplicata consentita e l'ordine di iterazione dei mapping è arbitrario.
Diamo un'occhiata a questi metodi, usando alcuni dati di esempio per una mappa del giorno della settimana a una persona che prevediamo funzionerà quel giorno.
Person alice = new Person( "Alice" );
Person bob = new Person( "Bob" );
Person carol = new Person( "Carol" );
Map.of()
Map.of
crea un vuoto Map
. Non modificabile, quindi non è possibile aggiungere voci. Ecco un esempio di tale mappa, vuota senza voci.
Map < DayOfWeek, Person > dailyWorkerEmpty = Map.of();
dailyWorkerEmpty.toString (): {}
Map.of( … )
Map.of( k , v , k , v , …)
sono diversi metodi che accettano da 1 a 10 coppie chiave-valore. Ecco un esempio di due voci.
Map < DayOfWeek, Person > weekendWorker =
Map.of(
DayOfWeek.SATURDAY , alice , // key , value
DayOfWeek.SUNDAY , bob // key , value
)
;
weekendWorker.toString (): {SUNDAY = Person {name = 'Bob'}, SABATO = Person {name = 'Alice'}}
Map.ofEntries( … )
Map.ofEntries( Map.Entry , … )
accetta qualsiasi numero di oggetti implementando l' Map.Entry
interfaccia. Java raggruppa due classi che implementano quell'interfaccia, una mutabile e l'altra immutabile: AbstractMap.SimpleEntry
, AbstractMap.SimpleImmutableEntry
. Ma non è necessario specificare una classe concreta. Dobbiamo semplicemente chiamare il Map.entry( k , v )
metodo, passare la nostra chiave e il nostro valore e recuperiamo un oggetto di Map.Entry
un'interfaccia di implementazione di qualche 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 )
);
ferialeWorker.toString (): {WEDNESDAY = Person {name = 'Bob'}, MARTEDÌ = Person {name = 'Bob'}, THURSDAY = Person {name = 'Carol'}, FRIDAY = Person {name = 'Carol'} , LUNEDÌ = Person {name = 'Alice'}}
Map.copyOf
Java 10 ha aggiunto il metodo Map.copyOf
. Passa una mappa esistente, ottieni una copia immutabile di quella mappa.
Appunti
Si noti che l'ordine delle mappe iteratore prodotta tramite Map.of
sono non garantiti. Le voci hanno un ordine arbitrario. Non scrivere il codice in base all'ordine visualizzato, poiché la documentazione avverte che l'ordine è soggetto a modifiche.
Si noti che tutti questi Map.of…
metodi restituiscono un Map
di una classe non specificata . La classe concreta sottostante può persino variare da una versione di Java a un'altra. Questo anonimato consente a Java di scegliere tra varie implementazioni, qualunque cosa si adatti in modo ottimale ai tuoi dati particolari. Ad esempio, se le tue chiavi provengono da un enum , Java potrebbe usare una EnumMap
sotto le copertine.