2010-07-01 293 views
14

我有一个多选变量发布到控制器。多选择工作的方式是,如果仅选择一个值,则将其作为单个字符串传递;如果选择了多个值,则将其作为字符串[]进行传递。我想保持简单的处理,并将传递的值视为相同。这样我就可以了最好的办法就是将它转换成列表,像这样:将字符串或字符串[]转换为使用Groovy列表

def selectedValues = params.selectedValues 

List valuelist = new ArrayList() 

if(selectedValues instanceof String) { 
    valuelist.add(selectedValues) 
} else { 
    valuelist = selectedValues as List 
} 

它的工作原理,但我很好奇,如果有做这一个更巧妙的方式,也许有一个衬垫:)。

当然,如果我简单地做:

List valuelist = selectedValues as List 

这将不会为单一选择的值工作,因为它会将其转换从可以说24 [2,4]

任何想法?

回答

20

您可以用拼合来获取:

def toList(value) { 
    [value].flatten().findAll { it != null } 
} 

assert(["foo"] == toList("foo")) 
assert(["foo", "bar"] == toList(["foo", "bar"])) 
assert([] == toList([])) 
assert([] == toList(null)) 

或者,如果你不想单独的方法做,你可以做到这一点作为一个班轮:

[params.selectedValues].flatten().findAll{ it != null } 

我会个人只是写两种方法,让类型系统为我处理:

def toList(String value) { 
    return [value] 
} 

def toList(value) { 
    value ?: [] 
} 

assert(["foo"] == toList("foo")) 
assert(["foo", "bar"] == toList(["foo", "bar"])) 
assert([] == toList([])) 
assert([] == toList(null)) 

它更有效率,我认为littl更明显的是发生了什么事情。

+0

谢谢,我喜欢使用flatten()的解决方案 – Micor 2010-07-02 01:04:28

+1

比.findAll {it!= null}只是' - null',它将删除数组中的所有空条目。 – mmigdol 2011-12-21 16:21:51

+0

谢谢,这是一个非常好的解决方案! :D – 2017-01-04 15:09:20

5

试试这个:这取决于你想要的空情况是什么 一对夫妇的其他选项:

def valueList = [] 
valueList = valueList + params?.selectedValues 

更新。正如Ted指出的,当params?.selectedValues为null时,上述解决方案将返回[null],这可能不是您想要的。

// if you want null to return [] 
def valueList = [] + (params?.selectedValues ?: []) 

// if you want null to return null 
def valueList = params?.selectedValues ? ([] + params?.selectedValues) : null 
+0

如果selectedValues为null,则不起作用,但可以通过if?then:else运算符轻松修复:def valueList = params?.selectedValues? [] + params?.selectedValues:[] – 2010-07-01 23:57:08

+0

正如我写的,我的解决方案将返回[null],您提出的解决方案将返回[],Micor提出的解决方案将为selectedValues == null返回null。你是对的,但如果空值是可能的话,那可能不是期望的行为。 – proflux 2010-07-02 00:22:14

18

在最新的Grails,只需使用params.list('xxx')

+1

对于这个问题,这实际上是更好的解决方案,因为它更简单,因此更优雅。你不需要用'flatten()'弄乱你的代码,或者使用方法重载和东西。 – 2012-06-05 22:26:39

+0

非常好!谢谢! – 2013-10-03 18:46:40