Преобразовать строку или строку [] в список с помощью Groovy - PullRequest
15 голосов
/ 02 июля 2010

У меня есть переменная множественного выбора, отправляемая в контроллер.Способ множественного выбора заключается в том, что он передается как одна строка, если было выбрано только одно значение, и как строка [], если выбрано более одного значения.Я хочу, чтобы обработка была простой и обрабатывал переданные значения одинаково.Так что лучший способ, которым я могу воспользоваться, - это преобразовать его в 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]

Есть идеи?

Ответы [ 3 ]

23 голосов
/ 02 июля 2010

Вы можете использовать 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) )

Это более эффективно, и я думаю немного более очевидно, что происходит.

18 голосов
/ 21 января 2011

В последних версиях просто используйте params.list('xxx').

5 голосов
/ 02 июля 2010

попробуйте это:

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

Обновление: Пара других опций, в зависимости от того, что вы хотите, чтобы нулевой регистр был.Как указал Тед, вышеприведенное решение вернет [null], когда params? .SelectedValues ​​будет нулевым, что может быть не тем, что вы хотите.

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

или

// if you want null to return null
def valueList = params?.selectedValues ? ([] + params?.selectedValues) : null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...