Java Variadic Arguments和HashMap构造函数

时间:2014-05-07 17:51:18

标签: java hashmap variadic

我想为HashMap使用更好的构造函数,所以我写了一个这样的:

public static Map<S, T> newMap(S obj1, T obj2, Object... objects) {
    h = new HashMap<S, T> ();
    h.put(obj1, obj2);
    ... // parse object and put it in h.
}

我的问题是我有很少的方法可以自己获取可变参数并将参数传递给newMap方法。

例如,

public static void foo(S arg0, T arg1, Object... kv) {
    ...
    newMap(tmp0, tmp1, kv); // WRONG: kv is an array and not a variadic transfer.
}

并称为:

foo(arg0, arg1, key1, val1, key2, val2);

这样可以正常工作,但是当调用newMap时:

newMap(tmp0, tmp1, tmp2, tmp3, kv);

并且调用foo是

foo(arg0, arg1)

然后空数组[]位于kv中。这会产生解析问题,因为我们现在在“objects”数组中有不均匀的元素数。

 objects = { tmp2, tmp3, [] }

这可以在不遍历kv对象数组中的参数并使用newMap调用的所有对象[tmp0,tmp1,tmp2,tmp3]重建数组的情况下完成。

参见: Better Map Constructor

1 个答案:

答案 0 :(得分:2)

你可以这样做。

public static <K, V> Map<K, V> newMap(K key1, V value1, Object... kvs) {
    Map<K, V> m = new HashMap<>();
    m.put(key1, value1);
    addToMap(map, kvs);
    return m;
}

private static <K, V> void addToMap(Map<K,V> map, Object[] kvs) {
    for(int i = 0; i < kvs.length; i++) {
        Object key = kvs[i];
        if (key instanceof Object[]) {
           addToMap(map, (Object[]) key);
        } else if (++i < kvs.length) {
           map.put((K) key, (V) kvs[i]);
        }
    }
}

如果它们是“键”,这将解包嵌套的Object [],如果它们是“值”,它们将保留为Object []。