Java 9提供了Map.of()
功能,可轻松创建具有固定值的地图。
问题:我想创建一个保留插入顺序的地图,如LinkedHashMap
。那家工厂有可能吗?至少map.of()
不保留顺序...
答案 0 :(得分:10)
确实没有像LinkedHashMap::of
这样的工厂方法,并且Map
本身没有订单,所以我看到的唯一方法是构建一个LinkedHashMap
如果您真的需要一个。
the JEP itself的顺子:
针对具体集合类(例如ArrayList,HashSet)的静态工厂方法已从该提案中删除...
还有一个难题,那就是类上的静态方法被子类继承。假设要添加静态工厂方法HashMap.of()。由于LinkedHashMap是HashMap的子类,因此应用程序代码可以调用LinkedHashMap.of()。最终将调用HashMap.of(),而不是您所期望的!
这里的要点是static
方法是继承的,但不是可重写的,因此,如果将这样的方法添加到HashMap
中,它可能不会在LinkedHashMap
中被重写。
如果可以使用guava
,则可以使用记录为以下内容的ImmutableMap
:
基于哈希的不可变地图,具有可靠的用户指定的迭代顺序...
答案 1 :(得分:0)
As documented on the Java apidoc of Map
(强调我):
不可修改的地图
Map.of
,Map.ofEntries
和Map.copyOf
静态工厂方法 提供一种方便的方法来创建不可修改的地图。地图 这些方法创建的实例具有以下特征:
- ...
- 映射的迭代顺序未指定,并且可能会发生变化。
- ...
不幸的是,Java API中没有等效的便捷方法来创建LinkedHashMap
。如果需要一致的迭代顺序,则需要手动创建一个LinkedHashMap
并填充它(如果需要,可以使用Collections.unmodifiableMap
包装它)。
请考虑创建自己的便捷方法,该方法与Map.of
等效,但具有一致的迭代顺序(或找到已经提供此功能的现有库)。
答案 2 :(得分:-1)
您还可以通过以下方式使用 vavr.io:
Map<String, String> mapPreservingInsertionOrder = io.vavr.collection.LinkedHashMap.of("key1", "val1", "key2", "val2").toJavaMap();