我想为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 = { tmp2, tmp3, [] }
无需遍历kv对象数组中的参数并为newMap调用重建具有所有对象[tmp0,tmp1,tmp2,tmp3]的数组,是否可以完成此操作?
参考:
Better Map Constructor
最佳答案
您可以改为这样做。
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 []。