2016-05-13 14 views
2

我想返回可变参数的列表的功能,使得即使参数已经是列表,我如何将可变参数转换为单个列表?

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时间的列表。有没有办法解决这个问题,或者其他一些能够完成我想要的模式?

回答

1

ARGS始终是一个数组,你的测试,如果参数表是一个列表将永远是假的:

def foo(Object ... args) { 
    args.class.array // returns true 
} 

相反检查args来第一个元素是一个列表:

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] 
2

考虑flatten()这将促进列表和参数的混合(如果确实需要的话):

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) 
相关问题