如何在Map.of工厂中保留插入顺序?

时间:2018-09-10 09:17:31

标签: java hashmap java-9 factory-method

Java 9提供了Map.of()功能,可轻松创建具有固定值的地图。

问题:我想创建一个保留插入顺序的地图,如LinkedHashMap。那家工厂有可能吗?至少map.of()不保留顺序...

3 个答案:

答案 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.ofMap.ofEntriesMap.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();