在Groovy中检查集合是否为null或空

138

我需要对一个集合进行null或empty检查;我认为!members?.empty是不正确的。有没有更groovy的方法来编写以下内容?

if (members && !members.empty) {
    // Some Work
}
3个回答

282

确实有一种更加简便的方法。

if (members) {
    //Some work
}

如果members是一个集合,那么就做所有的事情。进行空值检查以及为空检查(空集合被强制转换为false)。欢呼Groovy Truth


5
一种更“时髦”的方法是,例如,如果你对成员的最大年龄感兴趣,那么可以写如下代码:members?.age.max()。 - BTakacs
13
注意:当members为空时,members?.age.max()会报错"Cannot invoke method max() on null object"。你需要使用members?.age?.max() - GreenGiant
@BTakacs 我想你的意思是 members*.age.max() - Muhd
2
没有:GreenGiant的解决方案是最好的。 将“List members = null;”和“List members = [ [age: 12], [age: 24], [age: null], null ]”与两个解决方案进行比较。 - BTakacs
2
这种类型的检查对大多数情况都有效,但如果您的目的是检查变量是否为空,则可能会遇到一种边缘情况,即变量不为空,但布尔值为false。 - NikosDim
显示剩余3条评论

3

请注意,这种代码是有效的(你可能觉得它很丑,但这是你的权利 :)):

def list = null
list.each { println it }
soSomething()

换句话说,这段代码的空值/空检查是无用的:
if (members && !members.empty) {
    members.each { doAnotherThing it }
}

def doAnotherThing(def member) {
  // Some work
}

这段代码在第二行会失败,null.each将抛出NPE。第二个代码块使用了原始用户的帖子。我认为你可能误解了问题。 - Chewy

0
!members.find()

我认为现在解决这个问题的最佳方式是编写上述代码。它适用于 Groovy 1.8.1 http://docs.groovy-lang.org/docs/next/html/groovy-jdk/java/util/Collection.html#find()。例如:

def lst1 = []
assert !lst1.find()

def lst2 = [null]
assert !lst2.find()

def lst3 = [null,2,null]
assert lst3.find()

def lst4 = [null,null,null]
assert !lst4.find()

def lst5 = [null, 0, 0.0, false, '', [], 42, 43]
assert lst5.find() == 42

def lst6 = null; 
assert !lst6.find()

1
具有1个空元素的集合并不是空的,因此您的建议是错误的。 - Yura
1
如果集合为null会怎样? - Dan Markhasin
1
def lst6 = null; assert !lst6.find() 是正确的 - 没有出现错误。 - Zhurov Konstantin

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