我想要一个将varargs作为列表返回的函数,例如
ensure_list(1, 2, 3)
返回
[1,2,3]
但需要注意的是我想要
ensure_list([1, 2, 3])
返回相同的值。
我试过
def ensure_list(Object... args) {
if (args instanceof List<Object>) {
return args
} else {
return Arrays.asList(args)
}
}
但我得到
[[1,2,3]]
输入在args
之前包含在列表中。有没有办法解决这个问题,还是其他一些能够实现我想要的模式呢?
答案 0 :(得分:2)
考虑flatten()
这将促进列表和args的混合(如果确实需要):
def ensure_list(Object... args) {
args.flatten()
}
assert [1,2,3] == ensure_list(1, 2, 3)
assert [1,2,3] == ensure_list([1, 2, 3])
assert [1,2,3] == ensure_list([1, 2] , 3)
答案 1 :(得分:1)
args始终是一个数组,对于if args是一个List的测试将始终为false:
def foo(Object ... args) {
args.class.array // returns true
}
而是检查args的第一个元素是否为List:
def ensure_list(Object ... args) {
if (args.length == 1 && args[0] instanceof List) {
return args[0]
}
Arrays.asList(args)
}
groovy:000> ensure_list(1,2,3)
===> [1, 2, 3]
groovy:000> ensure_list([1,2,3])
===> [1, 2, 3]