【问题标题】:Convert String or String[] to List with Groovy使用 Groovy 将 String 或 String[] 转换为 List
【发布时间】:2011-03-10 21:18:39
【问题描述】:

我有一个多选变量发布到控制器。多重选择的工作方式是,如果只选择了一个值,则将其作为单个 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]

有什么想法吗?

【问题讨论】:

    标签: grails groovy


    【解决方案1】:

    您可以使用 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) )
    

    它更有效,我认为发生了什么更明显。

    【讨论】:

    • 短于 .findAll { it != null } 只是 - null,这将删除数组中的所有空条目。
    【解决方案2】:

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

    【讨论】:

    • 这实际上是该问题的更好解决方案,因为它更简单,因此更优雅。您无需使用“flatten()”或使用方法重载之类的东西来搞乱您的代码。
    【解决方案3】:

    试试这个:

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

    更新: 其他几个选项取决于您希望 null 大小写是什么。正如 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 ? [] + 参数?.selectedValues:[]
    • 如所写,我的解决方案将返回 [null],您提出的解决方案将返回 [],而 Micor 提出的解决方案将为 selectedValues == null 返回 null。不过你是对的,如果可能出现空值,这可能不是所需的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2021-01-13
    • 2023-03-26
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多