2010-07-01 20 views
14

Tengo una variable de selección múltiple publicando en el controlador. La forma en que funciona la selección múltiple es que se pasa como una sola cadena si solo hubo un valor seleccionado y como una cadena [] si se seleccionó más de un valor. Quiero seguir procesando de forma simple y tratar los valores pasados ​​de la misma manera. Así que la mejor forma posible para arriba es para convertirlo en una lista de este modo:Convertir cadena o cadena [] a la lista con Groovy

def selectedValues = params.selectedValues 

List valuelist = new ArrayList() 

if(selectedValues instanceof String) { 
    valuelist.add(selectedValues) 
} else { 
    valuelist = selectedValues as List 
} 

Funciona, pero tengo curiosidad si hay una manera más groovy para hacer esto, tal vez con un chiste :).

Por supuesto, si lo hago simplemente:

List valuelist = selectedValues as List 

No va a trabajar para un solo valor seleccionado, ya que lo convertirá de digamos 24 a [2,4]

¿Alguna idea?

Respuesta

20

Puede utilizar aplanar para conseguir que:

def toList(value) { 
    [value].flatten().findAll { it != null } 
} 

assert(["foo"] == toList("foo")) 
assert(["foo", "bar"] == toList(["foo", "bar"])) 
assert([] == toList([])) 
assert([] == toList(null)) 

O, si usted no desea un método independiente, puede hacerlo como un trazador de líneas:

[params.selectedValues].flatten().findAll{ it != null } 

que había personalmente acaba de escribir dos métodos y permitir que el acuerdo con el sistema de tipos para mí:

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)) 

es más eficiente y creo que un peq Es más obvio lo que está pasando.

+0

Gracias, me gusta la solución que usa flatten() – Micor

+1

más corta que .findAll {it! = Null} es simplemente '- null', que eliminará todas las entradas nulas de la matriz. – mmigdol

+0

¡Gracias, es una solución muy buena! : D –

5

probar esto:

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

Actualizar: Un par de otras opciones dependiendo de lo que quiere el nulo caso que sea. Como señaló Ted, la solución anterior devolverá [null] cuando params? .selectedValues ​​sea nulo, lo que puede no ser lo que usted desea.

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

o

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

que no funciona si selectedValues ​​es nulo, pero eso se soluciona fácilmente con el operador if? Then: else: def valueList = params? .selectedValues? [] + params? .selectedValues: [] –

+0

Como está escrito, mi solución devolverá [null], la solución que propondrá devolverá [], y la solución propuesta por Micor devolverá nulo para selectedValues ​​== null. Sin embargo, tienes razón, puede que ese no sea el comportamiento deseado si un valor nulo es una posibilidad. – proflux

18

En los últimos griales, sólo tiene que utilizar params.list('xxx').

+1

Esta es en realidad la mejor solución para ese problema, ya que es la más simple, por lo tanto, más elegante. No necesita estropear su código con 'flatten()' o usar sobrecarga de método y esas cosas. –

+0

¡Muy bonito! ¡Gracias! –