web-dev-qa-db-ja.com

StringまたはString []をGroovyでリストに変換する

コントローラーに複数の選択変数を投稿しています。複数選択が機能する方法は、選択された値が1つしかない場合は単一の文字列として渡され、複数の値が選択された場合はString []として渡されることです。処理をシンプルに保ち、渡された値を同じように扱いたいです。したがって、私ができる最善の方法は、次のようにリストに変換することです。

def selectedValues = params.selectedValues

List valuelist = new ArrayList()

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

それは機能しますが、これを行うためのよりグルーヴィーな方法があるかどうか、おそらく1つのライナーで興味があります:)。

もちろん、私が単純に行う場合:

List valuelist = selectedValues as List

たとえば24から[2,4]に変換されるため、選択した1つの値では機能しません。

何か案は?

16
Micor

Flattenを使用してそれを取得できます。

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

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

または、別のメソッドが必要ない場合は、1つのライナーとして実行できます。

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

私は個人的に2つのメソッドを記述し、型システムにそれを処理させます。

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

それはより効率的で、何が起こっているのかもう少し明白だと思います。

25
Ted Naleid

最新のGrailsでは、params.list('xxx')を使用するだけです。

19
Ford Guo

これを試して:

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

更新: nullケースをどのようにするかに応じて、他のいくつかのオプション。 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
5
proflux