编写Java程序时,我遇到如下问题:
Map<Object, Map<Object, Map<Object, Object>>> map = new HashMap<>();
/**
* put operations
**/
Map<Object, Map<Object, Object>> a = null;
Map<Object, Object> b = null;
Object c = null;
a = map.get(/*some object*/);
if(a != null) {
b = a.get(/*some object*/);
}
if(b != null) {
c = b.get(/*some object*/);
}
if(c != null) {
/*do what I want to do*/
}
如果我想确保c
不是null
,我需要添加“if”三次以确保代码可以毫无例外地运行。有没有更好的方法呢?
答案 0 :(得分:2)
在实现类似内容的类中封装所需的功能:
interface ThreeKeysMap {
void put(Object keyA, Object keyB, Object keyC, Object value);
Object get(Object keyA, Object keyB, Object keyC);
}
或者,您可以为复合键创建一个类:
public class ThreeKey {
public Object keyA;
public Object keyB;
public Object keyC;
// TODO: MUST override equals and hashCode methods or map won't work!!!!
}
并将其用作地图的关键字:Map<ThreeKey, Object> map = new HashMap<>();
答案 1 :(得分:0)
您可以创建一个类Key<T,E>
来保存您的第一对对象,然后创建一个地图
Map<Key<T,E>, Object>
这对我来说似乎更加巧妙,因为它似乎使用前两个对象作为键,嵌套字典方法对于这样的任务来说不那么优雅。
请注意,如果您遵循此方法 - 您必须覆盖equals()
和hashCode()
,并且根据使用情况 - 有时也compareTo()
答案 2 :(得分:0)
我认为Map
接口的getOrDefault - 方法可以在这里工作。特别是如果你将它与Optional类结合起来,如下所示:
Map<Object, Map<Object, Map<Object, Object>>> map = new HashMap<>();
Map<Object, Map<Object, Object>> a = map.getOrDefault("", Collections.emptyMap());
Map<Object, Object> b = a.getOrDefault("", Collections.emptyMap());
Optional.ofNullable(b.get("")).ifPresent(c -> {/* Do what I want to do */});
这样您只需使用getOrDefault
来检索空地图(我个人更喜欢null
值。Optional.ofNullable
是一种null
- 安全的创建方式Optional
对象,你可以在lambda表达式中做你想做的事情。
Optional
和Map.getOrDefault
都是Java 8的一部分。