Ответ 1
Почему вы не используете ArrayListMultimap.create()
для такого простого случая? Это стандартный способ создания простого HashMap/ArrayList, который, вероятно, является наиболее распространенным использованием мультимапа.
Если я хочу создать новый Multimap с простыми значениями по умолчанию, мне нужно сделать что-то вроде:
private final Multimap<Key, Value> providersToClasses = Multimaps
.newListMultimap(
new HashMap<Key, Collection<Value>>(),
new Supplier<List<Value>>() {
@Override
public List<Value> get() {
return Lists.newArrayList();
}
});
потому что Java не может вывести правильные типы, если для карты поддержки используется Maps.newHashMap
. Конечно, это может быть реорганизовано в отдельный метод, но есть ли способ написать его более кратко?
Почему вы не используете ArrayListMultimap.create()
для такого простого случая? Это стандартный способ создания простого HashMap/ArrayList, который, вероятно, является наиболее распространенным использованием мультимапа.
Я столкнулся с этой проблемой при написании клиентов и создании карт параметров запроса. Хороший сжатый шаблон, который мне нравится при создании мульти-карт, заключается в использовании ImmutableMultiMap#builder
Multimap<String, String> queryParams =
ImmutableMultimap.<String, String>builder()
.put("key-1", "value-1")
.put("key-1", "value-2")
.build();
Документация Guava утверждает, что метод create
, защищенный некоторыми другими ответами ", скоро будет устаревшим" в пользу различных форм, представленных ниже, и поэтому их следует избегать.
От Guava 21.0 вперед рекомендуемый способ создания объекта Multimap
, где значения хранятся в коллекциях ArrayList
, следующий:
MultimapBuilder.hashKeys().arrayListValues().build();
Вы также можете использовать параметры, если вы хотите указать ожидаемое количество ключей на карте и ожидаемое количество значений для каждой клавиши:
MultimapBuilder.hashKeys(expectedKeys).arrayListValues(expectedValuesPerKey).build();
Наконец, вы можете создать новый Multimap
из существующего с помощью этой конструкции:
MultimapBuilder.hashKeys().arrayListValues().build(multimap);
Если вы хотите использовать структуры данных, отличные от ArrayLists
в Multimap
, вы можете заменить вызов на arrayListValues()
на ряд других, перечисленных здесь.
Вот компактное решение:
Multimap<Integer, String> multi = HashMultimap.create();
Чтобы ответить на исходную проблему вывода типа, вы также можете указать общие типы статического метода с помощью Maps.<Key, Collection<Value>>newHashMap()
, но это, конечно, не более кратким, чем new HashMap<Key, Collection<Value>>()
(это может быть более согласованным).
В Java 8 это намного лучше, для всех видов мультиплексов. Это происходит по двум причинам:
HashMap
contructor.ArrayList
factory.Он выглядит следующим образом:
Multimap<Key, Value> providersToClasses =
Multimaps.newListMultimap(new HashMap<>(), ArrayList::new);