Groovy上的三元快捷方式

时间:2015-07-01 03:13:22

标签: groovy

我知道三元运算符本身已经是一个捷径,但我仍然想知道groovy中是否有快捷方式:

String typeFilter = (params?.type) ? params.type : ""

我在这里尝试做的是:

  

"如果HashMap params有一个type密钥,请将该密钥的值分配给typeFilter,否则,分配{{1}用空字符串"

我在想是否可以避免两次输入typeFilter,或者这是我给定方案的最短代码?感谢您的反馈。

3 个答案:

答案 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而不是空字符串。虽然对某些人来说可能很明显,但是当我前一段时间面对它时,这是一个真正的问题;)