
Apache Groovy的三元运算符:简化条件表达式
在本文中,您将探索这些概念如何应用于三元运算符,该运算符从 C 语言和 Java 中继承而来。(如果您尚未安装 Groovy,请阅读本系列文章的介绍。)
让我们从一个类似 Java 的 Groovy 脚本开始,该脚本使用三元运算符将参数的字符串版本转换为整数(如果可能)。 它还提供了默认值 0
1 String strParam = "42"
2 int intParam = strParam != null && strParam.isInteger() ? Integer.parseInt(strParam) : 0
3 println "strParam = '$strParam' intParam = $intParam"
4 strParam = "xyz"
5 intParam = strParam != null && strParam.isInteger() ? Integer.parseInt(strParam) : 0
6 println "strParam = '$strParam' intParam = $intParam"
7 strParam = null
8 intParam = strParam != null && strParam.isInteger() ? Integer.parseInt(strParam) : 0
9 println "strParam = '$strParam' intParam = $intParam"
相同的条件在第二、五和八行进行测试。 如果字符串参数有一个值,并且该值可以转换为整数,则整数参数接收转换后的值;否则,整数参数设置为 0。
运行此代码会产生
$ groovy Groovy07a.groovy
strParam = ‘42' intParam = 42
strParam = ‘xyz' intParam = 0
strParam = ‘null' intParam = 0
$
这给出了预期的结果。
在上一篇文章中,您了解到 Groovy 的真值版本意味着您不需要测试是否为 null
。 相反,您可以这样做
1 String strParam = "42"
2 int intParam = strParam && strParam.isInteger() ? Integer.parseInt(strParam) : 0
3 println "strParam = '$strParam' intParam = $intParam"
4 strParam = "xyz"
5 intParam = strParam && strParam.isInteger() ? Integer.parseInt(strParam) : 0
6 println "strParam = '$strParam' intParam = $intParam"
7 strParam = null
8 intParam = strParam && strParam.isInteger() ? Integer.parseInt(strParam) : 0
9 println "strParam = '$strParam' intParam = $intParam"
运行此代码,您会得到
$ groovy Groovy07b.groovy
strParam = ‘42' intParam = 42
strParam = ‘xyz' intParam = 0
strParam = ‘null' intParam = 0
$
这使代码更紧凑且更易于阅读。 在下一篇文章中,您将了解安全导航,它会进一步降低这种复杂性。 但就目前而言,请查看 Elvis 运算符,它是三元运算符的一个版本,旨在补充 Groovy 真值并简化以下形式的语句
expression1 ? expression1 : expression2
Elvis 运算符是 Groovy 中心主题之一的绝佳示例——不要重复自己 (DRY)。
让我们考虑一个类似的情况,您有一个方法或脚本的参数可能为 null
或 0。 为此,您希望在这种情况下有一个合理的默认值
1 def copies = null
2 copies = copies ?: 1
3 println "copies $copies"
4 copies = 0
5 copies = copies ?: 1
6 println "copies $copies"
7 copies = 5
8 copies = copies ?: 1
9 println "copies $copies"
当您运行此代码时,您会看到
$ groovy Groovy07c.groovy
copies 1
copies 1
copies 5
$
Groovy 3 进一步将 Elvis 运算符收缩为更 DRY 的 Elvis 赋值运算符
1 def copies = null
2 copies ?= 1
3 println "copies $copies"
4 copies = 0
5 copies ?= 1
6 println "copies $copies"
7 copies = 5
8 copies ?= 1
9 println "copies $copies"
看看运行此代码时会发生什么
$ groovy Groovy07d.groovy
copies 1
copies 1
copies 5
$
结论
Groovy 真值可以使使用三元运算符的表达式更紧凑、更易于阅读,因此也更易于维护。 Elvis 运算符和 Elvis 赋值语句为编写更紧凑和可读的代码提供了更多可能性。
根据我编写 Groovy 的经验,我发现由于 DRY 原则,我使用三元运算符的频率远高于 Java。 Java 中的三元表达式可能会达到一定程度的复杂性和冗长,需要非常仔细和周到的阅读。 我通常更喜欢在 Java 中使用 if
– then
– else
。 但在 Groovy 中不是这样!
最后,紧凑的三元表达式在 Groovy 闭包中真正有用,这些闭包需要根据情况返回不同的值,例如在使用 .collect()
准备值列表时。
照片由 Mike Enerio 拍摄于 Unsplash
3 条评论
评论已关闭。