2010-07-01 205 views
14

我有一個多選變量發佈到控制器。多選擇工作的方式是,如果僅選擇一個值,則將其作爲單個字符串傳遞;如果選擇了多個值,則將其作爲字符串[]進行傳遞。我想保持簡單的處理,並將傳遞的值視爲相同。這樣我就可以了最好的辦法就是將它轉換成列表,像這樣:將字符串或字符串[]轉換爲使用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]

任何想法?

回答

20

您可以用拼合來獲取:

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

它更有效率,我認爲littl更明顯的是發生了什麼事情。

+0

謝謝,我喜歡使用flatten()的解決方案 – Micor 2010-07-02 01:04:28

+1

比.findAll {it!= null}只是' - null',它將刪除數組中的所有空條目。 – mmigdol 2011-12-21 16:21:51

+0

謝謝,這是一個非常好的解決方案! :D – 2017-01-04 15:09:20

5

試試這個:這取決於你想要的空情況是什麼 一對夫婦的其他選項:

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

更新。正如Ted指出的,當params?.selectedValues爲null時,上述解決方案將返回[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 
+0

如果selectedValues爲null,則不起作用,但可以通過if?then:else運算符輕鬆修復:def valueList = params?.selectedValues? [] + params?.selectedValues:[] – 2010-07-01 23:57:08

+0

正如我寫的,我的解決方案將返回[null],您提出的解決方案將返回[],Micor提出的解決方案將爲selectedValues == null返回null。你是對的,但如果空值是可能的話,那可能不是期望的行爲。 – proflux 2010-07-02 00:22:14

18

在最新的Grails,只需使用params.list('xxx')

+1

對於這個問題,這實際上是更好的解決方案,因爲它更簡單,因此更優雅。你不需要用'flatten()'弄亂你的代碼,或者使用方法重載和東西。 – 2012-06-05 22:26:39

+0

非常好!謝謝! – 2013-10-03 18:46:40