将字符串或字符串[]转换为使用Groovy列表
我有一个多选变量发布到控制器。多选择工作的方式是,如果仅选择一个值,则将其作为单个字符串传递;如果选择了多个值,则将其作为字符串[]进行传递。我想保持简单的处理,并将传递的值视为相同。这样我就可以了最好的办法就是将它转换成列表,像这样:将字符串或字符串[]转换为使用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]
任何想法?
您可以用拼合来获取:
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更明显的是发生了什么事情。
试试这个:这取决于你想要的空情况是什么 一对夫妇的其他选项:
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
如果selectedValues为null,则不起作用,但可以通过if?then:else运算符轻松修复:def valueList = params?.selectedValues? [] + params?.selectedValues:[] – 2010-07-01 23:57:08
正如我写的,我的解决方案将返回[null],您提出的解决方案将返回[],Micor提出的解决方案将为selectedValues == null返回null。你是对的,但如果空值是可能的话,那可能不是期望的行为。 – proflux 2010-07-02 00:22:14
在最新的Grails,只需使用params.list('xxx')
。
对于这个问题,这实际上是更好的解决方案,因为它更简单,因此更优雅。你不需要用'flatten()'弄乱你的代码,或者使用方法重载和东西。 – 2012-06-05 22:26:39
非常好!谢谢! – 2013-10-03 18:46:40
谢谢,我喜欢使用flatten()的解决方案 – Micor 2010-07-02 01:04:28
比.findAll {it!= null}只是' - null',它将删除数组中的所有空条目。 – mmigdol 2011-12-21 16:21:51
谢谢,这是一个非常好的解决方案! :D – 2017-01-04 15:09:20