我正在开展一个项目,我需要一个懒惰地图,根据固定密钥集按需生成值。密钥是否在密钥集中以及与密钥相关联的值都只能按需计算。
如果没有固定的密钥集,map.containsKey(key)
只返回true
,如果已经计算了密钥的值并将其添加到地图之前(通过调用get(key)
)。这不是理想的行为 - 如果密钥是密钥集的一部分,map.containsKey(key)
应返回true
。
示例键集将是从0
到1.000
的所有整数。在有必要之前,我不想用所有密钥填充地图(例如,因为map.containsValue(value)
调用)。键集本身很容易计算,但我只想在必要时填充地图以节省内存。找出一个密钥是否应该包含在集合中也很简单。
使用现有HashMap
周围的包装器,我创建了一个满足上述要求的实现。
map.containsKey(key)
实现:private final Map<Integer, String> intern = new HashMap<>();
@Override
public synchronized boolean containsKey(Object key) {
if (intern.containsKey(key)) {
return true;
} else {
if (key instanceof Integer) {
Integer i = (Integer) key;
boolean contained = isKeyInKeySet(i);
if (contained) {
intern.put(i, null);
}
return true;
} else {
return false;
}
}
}
(请注意,map.get(key)
计算的值为null
。)
我无法对地图的集合视图(map.keySet()
,map.values()
和map.entrySet()
)进行迭代工作。如何调整默认Iterator
以包含键集中的所有值 - 即使它们不是地图的一部分呢?