Инициализировать экземпляр Map‹String, Object› из записей Map

Скажем, у меня есть несколько записей на карте, например:

var a = Map.entry("a", new Object());
var b = Map.entry("b", new Object());
var c = Map.entry("c", new Object());

var m = Map.of(a,b,c);  // error here

Я получаю эту ошибку:

Не удается разрешить метод 'of (java.util.Map.Entry, java.util.Map.Entry, java.util.Map.Entry)'

Я просто хочу создать новую карту из записей на карте, как мне это сделать? Вопрос не в том, как инициировать карту с учетом экземпляров Map.Entry.


person Community    schedule 04.02.2019    source источник
comment
Думаю, Map.ofEntries будет достаточно. Удивительно, что Map.of не перегружен для поддержки записей, но я думаю, что знаю почему.   -  person    schedule 04.02.2019
comment
@RobbyCornelissen это Java версии 11, ключевое слово var было введено, пожалуйста   -  person    schedule 04.02.2019
comment
На самом деле это восходит к версии Java 10, а не 11, так что...   -  person    schedule 04.02.2019
comment
точнее java-9   -  person Vishwa Ratna    schedule 04.02.2019
comment
@rakim из связанного ответа... Причина этого в том, что существует реализация varargs для List.of и Set.of, но для создания аналогичного API для Map и ключи, и значения должны были быть упакованы, как указано в JEP. Итак, то же самое было создано с использованием varargs типа Map.entry()... в сторону: вместо этого обновили тег до java-9   -  person Naman    schedule 04.02.2019
comment
@CommonMan Ключевое слово var было введено в Java 10, а не в Java 9.   -  person Mark Rotteveel    schedule 04.02.2019
comment
Вам повезло, что вы передали Map.of нечетное количество аргументов. Если бы вы передали четное количество аргументов, m была бы картой от записи к записи, в частности, Map<Map.Entry<String,Object>,Map.Entry<String,Object>>.   -  person Stuart Marks    schedule 13.02.2019


Ответы (5)


Заменять

Map.of(a,b,c); 

с

Map.ofEntries(a,b,c);

Если вы хотите по-прежнему использовать Map.of(), вы должны явно вставить ключи и значения.

Map.Entry() возвращает неизменяемый Map.Entry, содержащий заданный ключ и значение. Эти записи подходят для заполнения экземпляров Map с использованием метода Map.ofEntries().

Когда использовать Map.of() и когда использовать Map.ofEntries()< /а>

person Vishwa Ratna    schedule 04.02.2019

Простой ответ:

var a = Map.entry("a", new Object());
var b = Map.entry("b", new Object());
var c = Map.entry("c", new Object());

var m = Map.ofEntries(a,b,c);  // ! use Map.ofEntries not Map.of

И тип Map.entry(key,val) — это Map.Entry<K,V>, если вам интересно.

person Community    schedule 04.02.2019

Из jdk-9 вы можете использовать Map.of() для создания Map с парами ключ-значение

Map<String, Object> map = Map.of("a", new Object(), "b", new Object(), "c", new Object());

А также с помощью SimpleEntry

Map<String, Object> map = Map.ofEntries(
  new AbstractMap.SimpleEntry<>("a", new Object()),
  new AbstractMap.SimpleEntry<>("b", new Object()),
  new AbstractMap.SimpleEntry<>("c", new Object()));

Или воспользовавшись предложением Map.ofEntries OP

person Deadpool    schedule 04.02.2019
comment
Map.ofEntries был тем, что я искал - person ; 04.02.2019

Использовать это

var m = Map.ofEntries(a, b, c);

вместо

var m = Map.of(a,b,c);
person Mukit09    schedule 04.02.2019

Чтобы создать карту из записей, используйте:

var a = Map.entry("a", new Object());
var b = Map.entry("b", new Object());
var c = Map.entry("c", new Object());

var m = Map.ofEntries(a,b,c);

or:

var m = Map.ofEntries(
             entry("a", new Object()),
             entry("b", new Object()),
             entry("c", new Object()));

Вы также можете создать карту без явного создания записей:

var m = Map.of("a", new Object(),
               "b", new Object(),
               "c", new Object());
person ETO    schedule 04.02.2019