在Java 8中,下面这个变量的最佳声明是什么?
在飞镖:
const Map<Integer,Map<String, String>> data = {
1: {'name': 'John', 'age' : '20'},
2: {'name': 'Mary', 'age' : '30'}
}
不要将数据建模为嵌套映射,如果有更好的数据类型可以更精确地表示域中允许的值,则不要使用String。
在编写和修改代码时,利用Java的静态类型给自己提供尽可能多的帮助。
class Person {
private final long id;
private final String name;
private final int age;
public Person(long id, String name, int age) {
... assign to fields ...
}
... getters ...
}
实际的Map
可以是:
Map<Long,Person> data = new TreeMap<>();
将按键的自然顺序排序。
注意这个映射是不可修改的:
Map<Integer, Map<String, String>> data = Map.of(
1, Map.of("name", "John", "age", "20"),
2, Map.of("name", "Mary", "age", "30")
);
如果你想了解更多关于初始化hashmap的信息,可以查看这个教程https://www.baeldung.com/java-initialize-hashmap
如果您想保持顺序,请使用LinkedHashMap
。键按添加的顺序保存。下面是两个例子。
- 首先对每个条目执行此操作。使用
computeIfAbsent()
,如果找不到内部映射,则计算内部映射,否则使用现有映射。
Map<Integer, Map<String, String>> data = new LinkedHashMap<>();
data.computeIfAbsent(1, v -> new LinkedHashMap<>()).put("name", "John");
data.computeIfAbsent(1, v -> new LinkedHashMap<>()).put("age", "20");
data.computeIfAbsent(2, v -> new LinkedHashMap<>()).put("name", "Mary");
data.computeIfAbsent(2, v -> new LinkedHashMap<>()).put("age","30");
- 再次使用
LinkedHashMap
,将Map.of
声明作为参数传递给构造函数。然后地图就会变。
Map<Integer, Map<String, String>> data =
new LinkedHashMap<>(Map.of(
1,new LinkedHashMap<>(
Map.of("name", "john", "age", "20")),
2, new LinkedHashMap<>(Map.of("name", "Mary",
"age", "30"))));
data.entrySet().forEach(System.out::println);
打印
1={name=john, age=20}
2={name=Mary, age=30}