有没有更好的方法来以常规方式编写此空检查和非空检查?


101

在执行某些逻辑之前,我需要对某些代码执行空/空检查。我下面有项目,因为我觉得!members?.empty不正确。

有没有更时髦的方式来写以下内容?

if (members && !members.empty) {
    // Some Work
}

Answers:


209

确实存在Groovier方式。

if(members){
    //Some work
}

尽一切可能members是一个集合。空检查和空检查(将空集合强制到false)。冰雹Groovy真相。:)


3
例如,如果您对成员中的最大年龄感兴趣,则可以使用以下更“ groovier”的方法:您可以编写以下内容:member?.age.max()
BTakacs 2014年

9
注意:members?.age.max()当成员为null时,“无法在null对象上调用方法max()”引起的爆炸。您需要members?.age?.max()
GreenGiant

@VinodJayachandran是的
dmahapatro

2
否:GreenGiant的解决方案是最好的:检查List members = null;List members = [ [age: 12], [age: 24], [age: null], null ]反对两种解决方案
BTakacs

2
这种检查类型适用于大多数情况,但是如果您的目的是检查变量是否为null,则可能会遇到一个
极端的

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个null元素的集合不是空的,因此您的建议是错误的
Yura

1
如果集合为空怎么办?
Dan Markhasin

1
def lst6 = null; 断言!lst6.find()是正确的-没有错误发生
Zhurov Konstantin

0

仅供参考,这种代码有效(您很难看,这是您的权利:)):

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

换句话说,此代码的null / empty检查没有用:

if (members && !members.empty) {
    members.each { doAnotherThing it }
}

def doAnotherThing(def member) {
  // Some work
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.