Подтвердить что ты не робот

Компактный способ создания Guava Multimaps?

Если я хочу создать новый 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. Конечно, это может быть реорганизовано в отдельный метод, но есть ли способ написать его более кратко?

4b9b3361

Ответ 1

Почему вы не используете ArrayListMultimap.create() для такого простого случая? Это стандартный способ создания простого HashMap/ArrayList, который, вероятно, является наиболее распространенным использованием мультимапа.

Ответ 2

Я столкнулся с этой проблемой при написании клиентов и создании карт параметров запроса. Хороший сжатый шаблон, который мне нравится при создании мульти-карт, заключается в использовании ImmutableMultiMap#builder

Multimap<String, String> queryParams = 
  ImmutableMultimap.<String, String>builder()
    .put("key-1", "value-1")
    .put("key-1", "value-2")
    .build();

Ответ 3

Документация 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() на ряд других, перечисленных здесь.

Ответ 4

Вот компактное решение:

Multimap<Integer, String> multi = HashMultimap.create();

Ответ 5

Чтобы ответить на исходную проблему вывода типа, вы также можете указать общие типы статического метода с помощью Maps.<Key, Collection<Value>>newHashMap(), но это, конечно, не более кратким, чем new HashMap<Key, Collection<Value>>() (это может быть более согласованным).

Ответ 6

В Java 8 это намного лучше, для всех видов мультиплексов. Это происходит по двум причинам:

Он выглядит следующим образом:

Multimap<Key, Value> providersToClasses =
    Multimaps.newListMultimap(new HashMap<>(), ArrayList::new);