Java에서 null 및 empty 컬렉션의 유효성을 검사하는 모범 사례


210

컬렉션이 비어 있는지 확인하고 싶습니다 null. 누구든지 모범 사례를 알려주십시오.

현재 다음과 같이 확인하고 있습니다.

if (null == sampleMap || sampleMap.isEmpty()) {
  // do something
} 
else {
  // do something else
}

10
다른 것을 제외하고 사용 null == sampleMap하지 않는지 생각해보십시오 sampleMap == null. 대부분의 사람들은 후자가 더 읽기 쉽다는 것을 알고 있습니다. 전자는 다른 언어에서 온 것입니다.
Jon Skeet

6
그건 그렇고, null 수집이 잘못되었습니다. 가능하면 빈 컬렉션을 대신 사용하십시오. See Effective Java: Item 43 - Return empty arrays or collections, not nulls.
卢 声 远 Shengyuan Lu

@JonSkeet 사람들은 == 대신 =를 쓰는 경우 null == sampleMap을 사용합니다. sampleMap == null을 사용하는 경우 하나를 잊었을 때 sampleMap = null이되어 오류가 발생하지 않으므로 다른 방법으로 작성하면 개발자가 볼 수 있습니다.
Uri Loya

1
@UriLoya : if (null = sampleMap)Java로 작성 하면 컴파일 오류가 발생합니다. 그것이 바로 나의 첫 번째 의견의 요점입니다. 이 언어의 "이유"는 언어마다 다르지만 사람들이 왜 그렇게 하는지를 고려하지 않았기 때문에 가독성 저하에도 불구하고 다른 언어로 전파되었습니다 .
Jon Skeet

org.apache.commons.collections4.CollectionUtils 패키지에있는 CollectionUtils 클래스를 사용할 수 있습니다. 비어 있거나 널 (null)을 찾는 많은 유틸리티 메소드가 있습니다.
vikash

답변:


313

당신이 사용하는 경우 아파치 코 몬즈 컬렉션 프로젝트의 라이브러리를, 당신은 사용할 수 있습니다 CollectionUtils.isEmptyMapUtils.isEmpty()수집 또는지도 인 경우 각각 확인하는 방법 또는 널 (null)을 (그들은 "널 안전"입니다 즉).

이 메소드의 코드는 @icza 사용자가 자신의 답변에서 작성한 것입니다.

수행하는 작업에 관계없이 작성하는 코드가 적을수록 코드의 복잡성이 감소함에 따라 테스트해야하는 코드가 줄어 듭니다.


1
감사합니다 MapUtils.isEmpty는지도가 null 또는 비어 있는지 확인하는 완벽한 솔루션입니다
Narayan Yerrabachu

23
그들이 이름이 불쌍한 것은 유감 isNullOrEmpty입니다.
Scadge

72

이것이 가장 좋은 방법입니다. 도우미 메소드를 작성하여 수행 할 수 있습니다.

public static boolean isNullOrEmpty( final Collection< ? > c ) {
    return c == null || c.isEmpty();
}

public static boolean isNullOrEmpty( final Map< ?, ? > m ) {
    return m == null || m.isEmpty();
}

비슷한 기능이 있어야합니다 Map<?>.
Luiggi Mendoza

1
물론,지도에 하나를 추가 할 수도 있지만 제목에는 컬렉션이 명시되어 있습니다.
icza

1
m이 null인지 이해하지 못하면 .isEmpty ()가 NullPointerException rigth를 유발합니까? 그렇지 않으면 왼쪽 (m == null)이 true이면 나머지는 확인되지 않습니다
Ismail Sahin

4
@ismail ||연산자는 단락 연산자이므로 왼쪽 피연산자가 true인 경우 오른쪽 피연산자를 평가하지 않습니다. 그렇다면 m == null다음, m.isEmpty()호출되지 않습니다 (필요하지 않은 결과이다 true).
icza

완벽한 솔루션 @icza
gaurav

32

Spring 프레임 워크를 사용하는 경우 CollectionUtilsCollections (List, Array) 및 Map 등을 모두 검사 하는 데 사용할 수 있습니다 .

if(CollectionUtils.isEmpty(...)) {...}

어쩌면 MapUtils.isEmpty ()에 대해 이야기하지만 모든 컬렉션에 대해 이야기하는 것은 아닙니다.
Pavlo Chechehov

21

개인적으로 필자는 빈 컬렉션 대신 빈 컬렉션을 사용 null하고 알고리즘의 경우 컬렉션이 비어 있는지 여부에 관계없이 알고리즘이 작동하도록하는 것이 좋습니다.


10

당신이 봄을 사용하면 다음을 사용할 수 있습니다

boolean isNullOrEmpty = org.springframework.util.ObjectUtils.isEmpty(obj);

여기서 obj는 [map, collection, array, aything ...]입니다.

그렇지 않으면 : 코드는 다음과 같습니다

public static boolean isEmpty(Object[] array) {
    return (array == null || array.length == 0);
}

public static boolean isEmpty(Object obj) {
    if (obj == null) {
        return true;
    }

    if (obj.getClass().isArray()) {
        return Array.getLength(obj) == 0;
    }
    if (obj instanceof CharSequence) {
        return ((CharSequence) obj).length() == 0;
    }
    if (obj instanceof Collection) {
        return ((Collection) obj).isEmpty();
    }
    if (obj instanceof Map) {
        return ((Map) obj).isEmpty();
    }

    // else
    return false;
}

문자열 최고는 다음과 같습니다.

boolean isNullOrEmpty = (str==null || str.trim().isEmpty());

3

null을 확인 해야하는 경우 그 방법입니다. 그러나 이것을 제어 할 수 있다면 가능하면 빈 컬렉션을 반환하고 나중에 비어 있는지 확인하십시오.

이 스레드 는 C #과 거의 동일하지만 원칙은 Java에도 동일하게 적용됩니다. 거기에 언급 된 것처럼 null은 다음과 같은 경우에만 반환해야합니다

  • null은보다 구체적인 것을 의미 할 수 있습니다.
  • API (계약)로 인해 null이 반환 될 수 있습니다.

3

org.apache.commons.lang.Validate' notEmpty '메소드를 사용할 수 있습니다 .

Validate.notEmpty(myCollection)-> 지정된 인수 컬렉션이 null도 아니고 크기도 0 (요소 없음)인지 확인합니다. 그렇지 않으면 예외가 발생합니다.


1

Collection 객체가 비어 있는지, null인지 확인합니다. 아래에 제시된 모든 메소드는 org.apache.commons.collections4.CollectionUtils 패키지에 있습니다.

목록을 확인하거나 컬렉션 객체 유형을 설정하십시오.

CollectionUtils.isEmpty(listObject);
CollectionUtils.isNotEmpty(listObject);

객체의 맵 유형을 확인하십시오.

MapUtils.isEmpty(mapObject);
MapUtils.isNotEmpty(mapObject);

모든 메소드의 리턴 유형은 부울입니다.


-1

map을 포함하여 모든 콜렉션 isEmpty에 대해이 콜렉션 오브젝트에있는 method를 사용하십시오 . 그러나 먼저 null 검사를 수행해야합니다.

Map<String, String> map;

........
if(map!=null && !map.isEmpty())
......
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.