2010-07-01 11 views
14

Ich habe eine Mehrfachauswahl an Variable-Posting zum Controller. Die Funktionsweise von Mehrfachauswahl funktioniert so, dass sie als einzelne Zeichenfolge übergeben wird, wenn nur ein Wert ausgewählt wurde, und als Zeichenfolge [], wenn mehrere Werte ausgewählt sind. Ich möchte die Verarbeitung einfach halten und die übergebenen Werte gleich behandeln. So ist die beste Art und Weise kann ich mit ist es zu konvertieren, wie so zur Liste:String oder String [] in Liste mit Groovy konvertieren

def selectedValues = params.selectedValues 

List valuelist = new ArrayList() 

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

Es funktioniert, aber ich bin neugierig, ob es ein grooviger Weg, dies zu tun, vielleicht mit einem Motto :).

Natürlich, wenn ich einfach tun:

List valuelist = selectedValues as List 

Es wird nicht für einen einzelnen ausgewählten Wert arbeiten, wie es sagt umwandeln läßt es von 24 bis [2,4]

Irgendwelche Ideen?

Antwort

20

können Sie verwenden, glätten, dass zu bekommen:

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

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

Oder, wenn Sie nicht über ein separates Verfahren wollen Sie es als Motto tun können:

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

Ich würde persönlich nur zwei Methoden schreiben und den Typ System Deal mit ihm für mich lassen:

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 ist effizienter, und ich denke, ein littl Es ist offensichtlich, was passiert.

+0

Vielen Dank, ich mag die Lösung mit flatten() – Micor

+1

kürzer als .findAll {it! = Null} ist nur '- null', die alle Null-Einträge aus dem Array entfernt werden. – mmigdol

+0

Vielen Dank, es ist eine sehr schöne Lösung !! : D –

5

versuchen Sie dies:

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

Update: Ein paar andere Optionen, je nachdem, was Sie die Null Fall sein soll. Wie Ted darauf hingewiesen hat, gibt die obige Lösung [null] zurück, wenn params? .selectedValues ​​null ist, was möglicherweise nicht das ist, was Sie wollen.

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

oder

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

das funktioniert nicht, wenn selectedValues ​​null ist, aber das ist leicht mit dem if-then: else-operator zu beheben: def valueList = params? .selectedValues? [] + params? .selectedValues: [] –

+0

Wie geschrieben, gibt meine Lösung [null] zurück, die von Ihnen vorgeschlagene Lösung gibt [] zurück, und die vorgeschlagene Lösung Micor gibt null für selectedValues ​​== null zurück. Sie haben jedoch Recht, das ist möglicherweise nicht das gewünschte Verhalten, wenn ein Nullwert eine Möglichkeit ist. – proflux

18

In dem neuesten Grails, nur params.list('xxx') verwenden.

+1

Dies ist eigentlich die bessere Lösung für dieses Problem, da es einfacher und daher eleganter ist. Sie müssen Ihren Code nicht mit 'flatten()' durcheinanderbringen oder Methodenüberladung und andere Dinge verwenden. –

+0

Sehr nett! Vielen Dank! –