Как инициализировать Map <K, Map <K, V >> в одну строку - PullRequest
0 голосов
/ 07 мая 2018

Можно ли объединить эти две строки кода в одну?

    allPeople.put("Me", new HashMap<String, String>());
    allPeople.get("Me").put("Name", "Surname");

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Буквальная замена этих двух строк будет (в Java 8+):

allPeople.compute("Me", (k, v) -> new HashMap<>()).put("Name", "Surname");

или, в стиле ответа Бакса , для pre-Java 9 вы можете использовать:

allPeople.put("Me", new HashMap<>(Collections.singletonMap("Name", "Surname")));
0 голосов
/ 07 мая 2018

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

class Person {
    private String name;
    private String surname;

    public Person(String name, String surname) {
        this.name    = name;
        this.surname = surname;
    }

}

Затем вы создаете карту, которая отображает имена людей:

Map<String, Person> allPeople = new HashMap<>();

// Create an object that represents a person
Person me = new Person("name", "surname");

// Map the string "me" to the object me that represents me
allPeople.put("ME", me);
0 голосов
/ 07 мая 2018

Начиная с Java 9, имеется JDK, предоставляемый Map factory

allPeople.put("Me", Map.of("Name", "Surname"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...