如何在Java 8中最好地使用有序映射

  • 本文关键字:映射 Java java dictionary
  • 更新时间 :
  • 英文 :


在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}

相关内容

  • 没有找到相关文章

最新更新