two paths crisscross with benches

Apache Groovy的三元运算符:简化条件表达式

借助三元运算符掌握 Apache Groovy 中的条件控制。 了解如何…
首页 » 博客 » 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 中使用 ifthenelse。 但在 Groovy 中不是这样!

最后,紧凑的三元表达式在 Groovy 闭包中真正有用,这些闭包需要根据情况返回不同的值,例如在使用 .collect() 准备值列表时。

照片由 Mike Enerio 拍摄于 Unsplash

作者

如果您喜欢这篇文章,您可能也会喜欢这些