이 null 검사와 비어 있지 않은 검사를 그루비로 작성하는 더 좋은 방법이 있습니까?


101

일부 논리를 수행하기 전에 일부 코드에서 null / 빈 검사 를 수행해야합니다 . 내가 틀렸다고 생각하기 때문에 아래 항목이 있습니다 !members?.empty.

다음을 작성하는 훌륭한 방법이 있습니까?

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

답변:


209

실제로 Groovier Way가 있습니다.

if(members){
    //Some work
}

members컬렉션 이면 모든 작업을 수행합니다 . Null 검사 및 빈 검사 (빈 컬렉션이로 강제 됨 false). 우박 그루비 진실 . :)


3
좀 더 "멋진"방법은 예를 들어 회원 중 최대 연령에 관심이 있다면 다음과 같이 작성할 수 있습니다. members? .age.max ()
BTakacs

9
참고 : members?.age.max()멤버가 null 인 경우 "NULL 개체에 대해 max () 메서드를 호출 할 수 없습니다"라는 메시지가 표시됩니다. 필요합니다members?.age?.max()
GreenGiant 2014-08-22

예 @VinodJayachandran
dmahapatro

2
아니오 : GreenGiant의 솔루션이 최고입니다. 두 솔루션 모두 확인 List members = null;List members = [ [age: 12], [age: 24], [age: null], null ]비교
BTakacs

2
이 유형의 검사는 대부분의 경우에 작동하지만 변수가 null인지 확인하는 것이 목적이라면 변수가 null이 아니라 부울 false 인 가장자리 케이스로 끝날 수 있습니다
NikosDim

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의 요소가 컬렉션이 비어 있지
유라

1
컬렉션이 null이면 어떻게 되나요?
Dan Markhasin

1
def lst6 = null; ! 어설 lst6.find는 () 그것은 맞습니다 - 오류가 발생하지
Zhurov 콘스탄틴

0

참고로 이런 종류의 코드가 작동합니다 (추악하다는 것을 알 수 있습니다. :)) :

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

즉,이 코드에는 쓸모없는 null / 빈 검사가 있습니다 .

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

def doAnotherThing(def member) {
  // Some work
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.