tl;博士
在 Java 9 及更高版本中使用 Map.of… 方法。
Map< String , String > animalSounds =
Map.of(
"dog" , "bark" , // key , value
"cat" , "meow" , // key , value
"bird" , "chirp" // key , value
)
;
Map.of
Java 9 添加了一系列 Map.of 静态方法来满足您的需求:使用文字语法实例化不可变的 Map。
映射(条目的集合)是不可变的,因此您无法在实例化后添加或删除条目。此外,每个条目的键和值都是不可变的,无法更改。 See the Javadoc 用于其他规则,例如不允许 NULL,不允许重复键,以及映射的迭代顺序是任意的。
让我们看看这些方法,使用一些示例数据来绘制我们希望在这一天工作的人的星期几的地图。
Person alice = new Person( "Alice" );
Person bob = new Person( "Bob" );
Person carol = new Person( "Carol" );
Map.of()
Map.of 创建一个空的Map。不可修改,因此您无法添加条目。这是一个这样的地图的例子,没有任何条目。
Map < DayOfWeek, Person > dailyWorkerEmpty = Map.of();
dailyWorkerEmpty.toString():{}
Map.of( … )
Map.of( k , v , k , v , …) 是几种采用 1 到 10 个键值对的方法。这是两个条目的示例。
Map < DayOfWeek, Person > weekendWorker =
Map.of(
DayOfWeek.SATURDAY , alice , // key , value
DayOfWeek.SUNDAY , bob // key , value
)
;
weekendWorker.toString(): {SUNDAY=Person{ name='Bob' }, SATURDAY=Person{ name='Alice' }}
Map.ofEntries( … )
Map.ofEntries( Map.Entry , … ) 接受任意数量的实现Map.Entry 接口的对象。 Java 捆绑了两个实现该接口的类,一个是可变的,另一个是不可变的:AbstractMap.SimpleEntry、AbstractMap.SimpleImmutableEntry。但是我们不需要指定一个具体的类。我们只需要调用Map.entry( k , v )方法,传递我们的key和value,我们就可以得到一个实现Map.Entry接口的类的对象。
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(): {WEDNESDAY=Person{ name='Bob' }, TUESDAY=Person{ name='Bob' }, THURSDAY=Person{ name='Carol' }, FRIDAY=Person{ name=' Carol' }, MONDAY=Person{ name='Alice' }}
Map.copyOf
Java 10 添加了方法Map.copyOf。传递现有地图,取回该地图的不可变副本。
注意事项
请注意,通过Map.of 生成的地图的迭代器顺序是不保证的。条目具有任意顺序。不要根据看到的顺序编写代码,因为文档警告说顺序可能会发生变化。
请注意,所有这些Map.of… 方法都返回一个未指定类的Map。底层的具体类甚至可能因 Java 的一个版本而异。这种匿名性使 Java 可以从各种实现中进行选择,无论哪种方式最适合您的特定数据。例如,如果您的密钥来自 enum,Java 可能会在后台使用 EnumMap。