使用固定密钥集

时间:2015-09-04 22:16:03

标签: java collections maps lazy-loading

我正在开展一个项目,我需要一个懒惰地图,根据固定密钥集按需生成值。密钥是否在密钥集中以及与密钥相关联的值都只能按需计算。

如果没有固定的密钥集,map.containsKey(key)只返回true,如果已经计算了密钥的值并将其添加到地图之前(通过调用get(key))。这不是理想的行为 - 如果密钥是密钥集的一部分,map.containsKey(key)应返回true

示例键集将是从01.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以包含键集中的所有值 - 即使它们不是地图的一部分呢?

0 个答案:

没有答案