我有多个选择变量发布到控制器。多个选择的工作方式是,如果只选择了一个值,则将其作为单个String传递;如果选择了多个值,则将其作为String []传递。我想保持处理简单并将传递的值视为相同。所以我能想到的最好的方法是将它转换为List,就像这样:
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]
有什么想法吗?
答案 0 :(得分:22)
您可以使用flatten来实现:
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) )
效率更高,我认为发生了什么更为明显。
答案 1 :(得分:18)
在最新的Grails中,只需使用params.list('xxx')
。
答案 2 :(得分: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