即使参数已经是列表,如何将varargs转换为单个列表?

时间:2016-05-13 18:50:19

标签: groovy

我想要一个将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之前包含在列表中。有没有办法解决这个问题,还是其他一些能够实现我想要的模式呢?

2 个答案:

答案 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]