Как сохранить порядок вставки в фабрику Map.of? - PullRequest
0 голосов
/ 10 сентября 2018

Java 9 предлагает функцию Map.of() для простого создания карты с фиксированными значениями.

Проблема: я хочу создать карту, которая сохраняет порядок вставки, как LinkedHashMap. Это возможно с этой фабрикой? По крайней мере, map.of() не сохраняет порядок ...

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Как указано на Java apidoc Map (выделено мной):

Неизменяемые карты

Статические фабричные методы Map.of, Map.ofEntries и Map.copyOf предоставить удобный способ создания неизменяемых карт. Карта экземпляры, созданные этими методами, имеют следующие характеристики:

  • ...
  • Порядок отображений не указан и может быть изменен.
  • ...

К сожалению, в Java API нет эквивалентного удобного метода, который создает LinkedHashMap. Если вам нужен согласованный порядок итераций, вам нужно будет вручную создать LinkedHashMap и заполнить его (и - при необходимости - обернуть, используя Collections.unmodifiableMap).

Рассмотрите возможность создания собственного удобного метода, который эквивалентен Map.of, но с согласованным порядком итераций (или найдите существующую библиотеку, которая уже обеспечивает это).

0 голосов
/ 10 сентября 2018

Не существует фабричного метода, подобного LinkedHashMap::of, и у Map нет порядка как такового, поэтому я вижу только один способ - построить LinkedHashMap, если он вам действительно нужен.

Кстати от сам JEP :

Статические фабричные методы для конкретных классов сбора (например, ArrayList, HashSet) были удалены из этого предложения ...

Существует еще одна проблема: статические методы классов наследуются подклассами. Предположим, что был добавлен статический фабричный метод HashMap.of (). Поскольку LinkedHashMap является подклассом HashMap, код приложения может вызвать LinkedHashMap.of (). В конечном итоге это вызовет HashMap.of (), совсем не то, что можно было бы ожидать!

Дело в том, что static методы наследуются, но не могут быть переопределены, поэтому, если бы такой метод был добавлен к HashMap, он не мог бы быть переопределен в LinkedHashMap.

Если вы можете использовать guava, вы можете использовать ImmutableMap, который задокументирован как:

Неизменяемая карта на основе хеш-функции с надежным заданным пользователем порядком итераций ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...