首页 > 解决方案 > 如何实现始终返回非空值的排序多值树映射

问题描述

由于 Struts 的原因,我需要一个始终返回非空值的排序映射。

对于我的具体情况,我有以下实现,它工作正常

public class NonEmptyMap extends TreeMap<String, List<MyObject>> {
    @Override
    public List<MyObject> get(Object key) {

        final List<MyObject> result = super.get(key);
        if (result == null) {
            super.put((String) key, new NonEmptyList<MyObject>(MyObject.class));
        }
        return super.get(key);
    }

}

NonEmptyList是列表的特殊版本,它总是返回非空对象。例如nonEmptyList.get(2),对大小为 1 的 nonEmptyList 的调用将是创建 2 个空MyObject对象的原因,将它们插入列表并将最新元素返回给客户端调用。

我想概括实现以支持任何Key/Value

有没有现成的库实现?

标签: javacollectionsguavaapache-commonstreemap

解决方案


尽管我很确定您的列表实现不会遵守List合同(即如果索引超出范围get(),则应该抛出,除非您愿意从返回,但这可能会导致其他意外结果......),您可以使用自定义使用:(index < 0 || index >= size())MAX_INTEGERsize()ListMultimapMultimaps#newListMultimap(Map, Supplier<List>)

static <K extends Comparable<K>, V> ListMultimap<K, V> create(Class<V> valueClass) {
    return Multimaps.newListMultimap(new TreeMap<>(), () -> new NonEmptyList<>(valueClass));
}

推荐阅读