Преобразовать строку или строку [] в список с помощью 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