Преобразуйте строку или строку [] для списка с Groovy

У меня есть регистрация переменной выбора нескольких на контроллер. Путем несколько избранных работ состоят в том, что это передается как единственная Строка, если было только одно выбранное значение и как Строка [], если больше чем одно значение выбрало. Я хочу продолжать обрабатывать простой и рассматривать переданное значение (значения) то же. Таким образом, лучший способ, с которым я могу, состоит в том, чтобы преобразовать его для Списка как так:

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]

Какие-либо идеи?

15
задан Micor 1 July 2010 в 22:53
поделиться

2 ответа

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

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

24
ответ дан 1 December 2019 в 00:26
поделиться

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

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

Обновление: Пара других вариантов в зависимости от того, каким должен быть нулевой регистр. Как указал Тед, приведенное выше решение вернет [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
5
ответ дан 1 December 2019 в 00:26
поделиться