使用Groovy将String或String []转换为List

Mic*_*cor 15 grails groovy

我有一个多选择变量发布到控制器.多个选择的工作方式是,如果只选择了一个值,则将其作为单个String传递;如果选择了多个值,则将其作为String []传递.我想保持处理简单并将传递的值视为相同.所以我能做到的最好的方法是将其转换为List,如下所示:

def selectedValues = params.selectedValues

List valuelist = new ArrayList()

if(selectedValues instanceof String) {
    valuelist.add(selectedValues)
} else {
    valuelist = selectedValues as List
}
Run Code Online (Sandbox Code Playgroud)

它有效,但我很好奇,如果有一个更通常的方式来做这个,也许有一个班轮:).

当然,如果我只是这样做:

List valuelist = selectedValues as List
Run Code Online (Sandbox Code Playgroud)

它不适用于单个选定值,因为它会将它从24个转换为[2,4]

有任何想法吗?

Ted*_*eid 24

您可以使用flatten来实现:

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

assert( ["foo"] == toList("foo") )
assert( ["foo", "bar"] == toList(["foo", "bar"]) )
assert( [] == toList([]) )
assert( [] == toList(null) )
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想使用单独的方法,则可以将其作为单个方法:

[params.selectedValues].flatten().findAll{ it != null }
Run Code Online (Sandbox Code Playgroud)

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

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) )
Run Code Online (Sandbox Code Playgroud)

它效率更高,我认为发生了什么更明显.


For*_*Guo 19

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


pro*_*lux 5

试试这个:

def valueList = []
valueList = valueList + params?.selectedValues
Run Code Online (Sandbox Code Playgroud)

更新: 其他几个选项取决于您想要的空案例.正如Ted所指出的,当params?.selectedValues为null时,上面的解决方案将返回[null],这可能不是你想要的.

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

要么

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