Java 如何在一行上初始化映射

Java 如何在一行上初始化映射,java,dictionary,Java,Dictionary,是否可以将这两行代码合并为一行 allPeople.put("Me", new HashMap<String, String>()); allPeople.get("Me").put("Name", "Surname"); 从Java9开始,有一个JDK提供的映射 从Java9开始,有一个JDK提供的映射 这两行的文字替换将使用Java 8+: allPeople.compute("Me", (k, v) -> new HashMap<>()).p

是否可以将这两行代码合并为一行

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

从Java9开始,有一个JDK提供的映射


从Java9开始,有一个JDK提供的映射


这两行的文字替换将使用Java 8+:

allPeople.compute("Me", (k, v) -> new HashMap<>()).put("Name", "Surname");
或者,对于Java 9之前的版本,您可以使用:

allPeople.put("Me", new HashMap<>(Collections.singletonMap("Name", "Surname")));

这两行的文字替换将使用Java 8+:

allPeople.compute("Me", (k, v) -> new HashMap<>()).put("Name", "Surname");
或者,对于Java 9之前的版本,您可以使用:

allPeople.put("Me", new HashMap<>(Collections.singletonMap("Name", "Surname")));

您可能应该将人表示为对象。这样,您就不能对不存在的键调用getsomeKey,从而导致代码崩溃。这就是面向对象编程的思想。封装相关数据和功能。嵌套贴图也有类似的功能,但更容易出错。对于不支持对象的语言来说,这是有意义的。但是,将一个人表示为对象可以更好地控制映射所包含的字段,从而使代码更无错误

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);

您可能应该将人表示为对象。这样,您就不能对不存在的键调用getsomeKey,从而导致代码崩溃。这就是面向对象编程的思想。封装相关数据和功能。嵌套贴图也有类似的功能,但更容易出错。对于不支持对象的语言来说,这是有意义的。但是,将一个人表示为对象可以更好地控制映射所包含的字段,从而使代码更无错误

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);


请编辑你的标题以反映你的实际问题。我想把如何在一行上初始化地图,但它已经被修改了changed@Red这看起来是个合理的标题,继续吧it@Red你为什么认为你应该把这些组合成一行?@Red除非你想用莫尔斯电码和O通信,我不知道你的意思。即使你是,我仍然不知道你的意思。请编辑你的标题以反映你的实际问题。我想在一行上写上如何初始化地图,但已经完成了changed@Red这似乎是一个合理的标题,去吧,把它放进去it@Red你为什么认为你应该把这些组合成一行?@Red除非你想用莫尔斯电码与O通信,否则我不知道你的意思。即使你是,我仍然不知道你的意思;似乎不工作,但allPeople.putMe,新HashMapCollections.singletonMapName,姓氏工作完美,谢谢@AndyTurner是Java 9之前版本的等价物。两者都返回一个不可变的映射。新哈希映射。。。如果您想要一个可变映射,这两个都需要。在早期版本中,您可以使用allPeople.putMe,新的HashMapCollections.singletonMapName,姓氏。allPeople.putMe,map.ofName,姓氏;似乎不工作,但allPeople.putMe,新HashMapCollections.singletonMapName,姓氏工作完美,谢谢@AndyTurner是Java 9之前版本的等价物。两者都返回一个不可变的映射。新哈希映射。。。如果您想要一个可变的映射,那么这两个都需要。从架构的角度来看,您是对的。然而,我猜他/她可能只是在寻找一个非现实生活的技术解决方案。是的,但这是一个教员项目,我不允许做便便。。我知道这是没有道理的。@Matt或者仅仅是你不能总是按照你想要的方式改变事情这一事实。有时候你只是需要按照它的方式工作。@Red是的,这没有多大意义,哈哈。但正如安迪所说,有时候你确实需要利用现有的资源。使用Streams是一个很好的工具。但是,如果您不熟悉函数式编程和一些奇特的工具,那么就很难理解。因此,我避免使用流方法来说明如何从算法上解决问题。但使用JavaAPI可能比我编写的代码更能防止错误。从架构的角度看,你是对的。然而,我猜他/她可能只是在寻找一个非现实生活的技术解决方案。是的,但这是一个教员项目,我不允许做便便。。我知道这是没有道理的。@Matt或者仅仅是你不能总是按照你想要的方式改变事情这一事实。有时候你只是需要按照它的方式工作。@Red是的,这没有多大意义,哈哈。但正如安迪所说,有时候你确实需要利用现有的资源。使用Streams是一个很好的工具。但是,如果您不熟悉函数式编程和一些奇特的工具,那么就很难理解。因此,我避免使用流方法来说明如何从算法上解决问题。但是使用JavaAPI可能比我编写的代码更能防止错误。我认为在这里使用compute是危险的。如果有人看到这个代码并复制
e行添加第二个键/值对,它将失败。“最好用它。”安德烈亚斯,但那不一样。OP的代码用一个空映射替换所有存在的内容。你的建议保留了一切。我仍然认为您应该涵盖差异,我认为您应该包括Map.of variant以获得完整答案,并解释不可变映射与使用新HashMap使其可变。。。。这个问题过于简单,无法确定OP或其他阅读器是否需要添加多个键/值对。我认为在这里使用compute是危险的。如果有人看到该代码并复制该行以添加第二个键/值对,则该代码将失败。“最好用它。”安德烈亚斯,但那不一样。OP的代码用一个空映射替换所有存在的内容。你的建议保留了一切。我仍然认为您应该涵盖差异,我认为您应该包括Map.of variant以获得完整答案,并解释不可变映射与使用新HashMap使其可变。。。。问题过于简单,无法确定OP或其他阅读器是否需要添加多个键/值对。