我知道三元运算符本身已经是一个捷径,但我仍然想知道groovy
中是否有快捷方式:
String typeFilter = (params?.type) ? params.type : ""
我在这里尝试做的是:
"如果
HashMap
params
有一个type
密钥,请将该密钥的值分配给typeFilter
,否则,分配{{1}用空字符串"
我在想是否可以避免两次输入typeFilter
,或者这是我给定方案的最短代码?感谢您的反馈。
答案 0 :(得分:3)
您实际上只是描述了elvis运算符:
0.0.0.0
更多相关信息:http://docs.groovy-lang.org/latest/html/documentation/#_elvis_operator
请确保您了解Groovy的真相(http://mrhaki.blogspot.com/2009/08/groovy-goodness-tell-groovy-truth.html)
特别是涉及String typeFilter = params.type ?: ""
vs 0
vs null
的价值时。考虑一下:
empty
这会将params.age = 0
...
// elsewhere in the code
params.age = params.age ?: 6 // if no age provided default to 6
设置为params.age
,尽管已经使用6
进行了初始化!
答案 1 :(得分:1)
您是否考虑过具有空值的密钥type
的角落情况?如果发生这种情况,Elvis运营商将返回RHS。这可能与你想要实现的目标无关,但是对于你的要求(从字面上看)是不正确的:
“如果
HashMap
params
有一个type
密钥,请将该密钥的值指定给typeFilter
,否则请指定typeFilter
一个空字符串“
实施例。 (我使用'none'而不是空字符串来使输出更清晰。)
println( [:].type ?: 'none' )
=> none
println( [type: 42].type ?: 'none' )
=> 42
// But do you want null or 'none' in this case?
println( [type: null].type ?: 'none' )
=> none
答案 2 :(得分:0)
虽然@defectus提供的答案通常是正确的,但在某些角落情况下。请考虑以下示例:
def s = ''
def r = s.empty ?: 'notempty'
assert r == true
在上面的示例中,返回true
而不是空字符串。虽然对某些人来说可能很明显,但是当我前一段时间面对它时,这是一个真正的问题;)