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.ofmetodi statici per fare esattamente quello che vuoi: creare un'istanza immutabile Mapusando 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.ofcrea 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.Entryinterfaccia. 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.Entryun'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.ofsono 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 Mapdi 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 EnumMapsotto le copertine.