如何将空值检查使用Groovy简化?

26

这段Groovy代码有更“时髦”的写法吗:

def myVar=(System.getProperty("props") == null)?
    null : System.getProperty("props")

逻辑是:

  • 如果 System.getProperty("props") 为空,我希望 props 也为空;
  • 否则,我希望 props 的值为 System.getProperty("props") 的值。

8
停下来,喝杯咖啡,重新思考你在问题中所表达的陈述。 :) - dmahapatro
这绝对是一个好主意 :) - Paweł Piecyk
好的,让我来帮助你。如果 something 为空,我希望它被评估为 null,否则我希望 something 被评估为本身,这意味着我可以写 def a = **something**,这就是答案。 - dmahapatro
我的观点是专注于需求,并将其与问题中存在的代码行匹配。答案在问题的细节中。除非使用System.property["props"],否则你无法比def myVar = System.getProperty("props")更酷。 - dmahapatro
@PawełPiecyk 虽然咖啡仍然是个好主意。 - Will
显示剩余5条评论
1个回答

58
通常用于空值检查,我会使用?:(Elvis运算符,如果左侧为null或解析为false,则返回默认值)或?.(安全导航,如果左侧为空,则计算结果为null)。如果您想设置当属性不存在时要使用的默认值,可以这样做:
def myVar = System.properties['props'] ?: 'mydefaultvalue'

如果在System.properties中找不到键为'props'的值(或返回的值解析为false),则将myVar设置为'mydefaultvalue'。但由于您的情况下默认值为null,因此
def myVar = System.properties['props']

如果给定的键没有找到任何内容,则会返回null,因此也可以使用“would do the job as well”。

这里的Groovy改进包括:

  • 如果不需要GroovyString插值,请优先使用单引号字符串而不是双引号字符串

  • 对于映射和列表,请使用带方括号的索引语法(而不是'get'或'put')

  • 如果getter没有参数(与Java不同,Groovy实现了universal access principle),则使用shortened property form(不带get前缀);System.getProperty(String)是Java程序员的便利方法,但在Groovy中不需要

  • 使用?:简化默认值为null的情况

JavaScript中使用||的习惯用法:

def myVar = System.properties['props'] || 'mydefaultvalue'

在Groovy中不起作用。布尔测试的结果是布尔值,因此myVar被设置为true。


或者 def myVar = System.properties['props'] || 'mydefaultvalue' - Krzysztof Romanowski
2
@castus:如果我没记错的话,这似乎是 Ruby 中的一个熟悉习语,我也期望它在这里能够工作。但是在 Groovy 中,你的那行代码会导致 myVar 被设置为布尔值 true。 - Nathan Hughes
1
在build.gradle文件中,您可以使用以下代码获取Gradle属性及其默认值:findProperty('foo') ?: 'bar'findProperty()方法属于Project(https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html) - 这是一个顶级对象,您可以直接从脚本中进行接口操作。 - Phil Brock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接