一旦理解了需求,我基于 @AKSingh 关于嵌套映射的想法并进行了一些改进,提出了以下实现:
- 使用 Java 14+ 的
record
类型定义 CompositeId
,并重载构造函数以允许在没有 secondaryId
时使用空字符串替代。
- 利用 Map 接口的
compute*
方法来简化插入数据的过程。
- 创建了简单的
get
和 getAll
方法。将 getAll
方法重命名为 get
也是可行的,但目前这个名称更准确地描述了它返回的内容。
您还可以考虑直接使用字符串而非 CompositeId
类。
建议您接受 @AKSingh 的答案,并根据实际情况酌情采纳以下改进代码:
public class MapsDemo {
record CompositeId(String mainId, String secondaryId) {
public CompositeId(String mainId) {
this(mainId, "");
}
}
public Map<String, Map<String, String>> map = new HashMap<>();
public static void main(String[] args) {
new MapsDemo().start();
}
public void start() {
updateMap(new CompositeId("2", "3"), "val23");
updateMap(new CompositeId("2", "4"), "val24");
updateMap(new CompositeId("3", "5"), "val35");
updateMap(new CompositeId("4", "6"), "val46");
updateMap(new CompositeId("4"), "val4");
updateMap(new CompositeId("10"), "val10");
System.out.println(get(new CompositeId("2", "3")));
System.out.println(get(new CompositeId("4")));
System.out.println(getAll("2"));
System.out.println(getAll("4"));
}
public void updateMap(CompositeId key, String value) {
map.computeIfAbsent(key.mainId, v -> new HashMap<>())
.put(key.secondaryId, value);
}
public List<String> getAll(String mainId) {
return new ArrayList<>(map.get(mainId).values());
}
public String get(CompositeId key) {
return map.get(key.mainId).get(key.secondaryId);
}
}
这段代码运行后输出如下:
val23
val4
[val23, val24]
[val4, val46]