Преобразовать строку или строку [] в список с помощью Groovy

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

Он не будет работать для одного выбранного значения, поскольку он преобразует его из let say от 24 до [2,4]

Любые идеи?

Ответы

Ответ 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) )

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

Ответ 2

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

Ответ 3

попробуйте следующее:

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

Update: Пара других вариантов в зависимости от того, что вы хотите, чтобы это был нулевой случай. Как указал Тед, вышеупомянутое решение вернет [null], когда params?.selectedValues ​​имеет значение 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