Когда я буду использовать метод java Collections singletonMap? - PullRequest
74 голосов
/ 19 августа 2011

Я не понимаю, зачем вам нужны java Collections singletonMap ? Это полезно в многопоточных приложениях?

Ответы [ 6 ]

111 голосов
/ 19 августа 2011

По сути, это позволяет вам сделать это:

callAPIThatTakesAMap(Collections.singletonMap(key, value));

, а не это:

Map<KeyType, ValueType> m = new HashMap<KeyType, ValueType>();
m.put(key, value);
callAPIThatTakesAMap(m);

, что намного лучше, когда у вас есть только одна пара ключ / значение.Эта ситуация, вероятно, возникает не очень часто, но singleton() и singletonList() могут быть весьма полезны.

14 голосов
/ 19 августа 2011

Это полезно, если вам нужно передать карту в некоторый общий код (в качестве параметра или в результате метода), и вы знаете, что в этом конкретном случае - но, возможно, не в других случаях, которые передают карту в тот же общий код - карта, которую вы хотите передать, имеет только один ключ. В этом случае SingletonMap более эффективен, чем полноценная реализация карты, а также более удобен для программиста, поскольку все, что вам нужно сказать, можно сказать в конструкторе.

7 голосов
/ 23 июня 2015

Кроме того, реализация SingletonMap, возвращаемая Collections.singletonMap (), имеет меньший объем памяти, чем обычный HashMap.Он должен содержать только два поля-члена: ключ и значение, тогда как HashMap поддерживает внутренний массив объектов Node плюс другие поля-члены.Поэтому, если вы создаете лот этих карт в памяти, было бы разумно выбрать использование Collections.singletonMap ().

4 голосов
/ 19 августа 2011

Это в основном для удобства и абстракции. Некоторые API принимают Collection в качестве аргумента, и приятно иметь простой способ конвертировать объекты в Set или Map.

singletonMap() и singletonList() были фактически введены после singletonSet() в Java 1.3, потому что singletonSet() оказался полезным.

2 голосов
/ 28 февраля 2018

много ответов говорили вам когда, но я хочу указать, когда not use it

не используйте , если хотите put items later on,

потому что поставленная реализация singletonMap сгенерирует UnsupportedOperationException

0 голосов
/ 14 августа 2014

Это просто еще один пример, но я написал следующую строку кода:

@Override public Map<Action, Promise<Boolean>> actOnResults() throws Exception {
    return Collections.singletonMap(Action.UPDATE_DATABASE, saver.save(results));
}

обратите внимание на @Override. Интерфейс в целом может принимать карты многих вещей; этот конкретный экземпляр просто всегда возвращает карту, содержащую одну вещь. Также обратите внимание, что ключом к карте является Enum. Таким образом, карты никогда не должны быть большими, они просто должны содержать результаты тех действий, которые указаны. В моем реальном примере есть до 5 действий, и этот экземпляр использует только одно из них.

Чтобы быть полным, EnumSet или EnumMap часто уместны в этих случаях, но они все еще досадно многословны по сравнению с кодом выше.

...