Google Guava isNullOrEmpty for collections


102

Guava에 문자열에 대한 isNullOrEmpty 유틸리티 메서드가 있음을 알았습니다.

Strings.isNullOrEmpty(str)

목록과 비슷한 것이 있습니까? 같은 것

Lists.isNullOrEmpty(list)

다음과 같아야합니다.

list == null || list.isEmpty()

또한 Arrays와 비슷한 것이 있습니까? 같은 것

Arrays.isNullOrEmpty(arr)

다음과 같아야합니다.

arr == null || arr.length == 0

답변:


141

아니요,이 방법은 구아바에 존재하지 않으며 실제로 "아이디어 묘지"에 있습니다.

"is null or empty"는 컬렉션에 대해 정말로 묻고 싶은 질문이라고 생각하지 않습니다.

컬렉션이 null 일 수 있고 null이 비어있는 것과 동일하게 처리되어야하는 경우 다음과 같이 모든 모호함을 제거합니다.

Set<Foo> foos = NaughtyClass.getFoos();
if (foos == null) {
  foos = ImmutableSet.of();
}

또는 다음과 같이 (원하는 경우) :

Set<Foo> foos = MoreObjects.firstNonNull(
    NaughtyClass.getFoos(), ImmutableSet.<Foo>of());

그 후에는 .isEmpty()평소처럼 사용하시면 됩니다. 장난 꾸러기 API를 호출하자마자이 작업을 즉시 수행하면 무기한으로 계속되는 대신 이상한 점이 발생합니다.

그리고 "빈 컬렉션을 의미하는 null"이 반환되지 않고 전달되는 경우 작업은 간단합니다. 그냥 NullPointerException던지 도록 내버려두고 호출자를 구성합니다.


7
일부 프레임 워크가 필드를 null로 설정하고 객체에 빈 목록을 명시 적으로 설정하고 사용하더라도이를 제어 할 수없는 경우 (목록에 바인딩 할 때 스프링 프레임 워크) 어떨까요?
OMax

15
내 대답은 동일합니다. null가능한 한 빨리 빈 컬렉션으로 정규화하여 모호성을 제거하십시오 . 그렇게 할 수 없다면, 당신은 정말로 자신의 사소한 isNullOrEmpty (Collection) 도우미를 작성하고자하는 <1 %의 사용자 중 하나 일 수 있습니다.
Kevin Bourrillion 2012 년

8
(또는 도우미를 건너 뛰고 if (collection == null || collection.isEmpty())필요한 경우에 작성 하십시오! 그렇게 나쁩니 까?)
Kevin Bourrillion 2012-08-28

13
이것은 실제로 질문을 전혀 다루지 않는 독단적 답변입니다. 또한 방어적인 프로그래밍 원칙에 위배됩니다.
Neovibrant 2013-10-16

11
@Neovibrant 질문은 Guava 라이브러리의 기능에 관한 것이고 대답은 Guava의 수석 개발자 중 한 사람의 것이기 때문에 대답은 "아니요, Guava에는 없습니다"라고 암시합니다. 답변은 그 진술로 시작하여 개선 될 수 있습니다. :)
Grundlefleck

37

구아바 전역에서 발견되는 경향 중 하나는 nulls 에 대해 매우 적대적인 경향이 있다는 것 입니다. 저자 null는 당신이 아마 당신이 사용하는 만큼 많이 사용하지 못하도록하고 싶어하며 , 사용하기 쉽게 해주는 유틸리티 방법을 제공하는 null것은이 목적에 역효과를 줄 것입니다.

Guava의 패러다임을 사용하려면이 컬렉션 (또는 배열)의 소스가 선택적으로를 반환해야하는지 고려하십시오 null. 그렇지 않은 경우 표시하고 @NonNull대신 빈 컬렉션을 반환하십시오 null. 또는 null값 이없는 목록을 예상하는 함수에 대한 매개 변수로를 사용 Preconditions.checkNotNull하는 null것이 좋습니다.이 경우 가 (예기치 않게) 전달 되면 예외가 발생합니다 .

null정말로 합법적 이라면 그렇게 list == null || list.isEmpty()어렵지 않습니다.


9
일관성이 없습니다. 같은 인수는 문자열을 위해 만든, 아직 할 수 있다 Strings.isNullOrEmpty은 ()
돈 치들

29

commons-collections 에는 CollectionUtils.isEmpty () 가 있습니다.


1
안타깝게도 최신 버전에서 제거 된 것 같습니다. org.apache.commons.collections15.CollectionUtils를 참조하십시오.
spaaarky21

1
apache.commons.collection에서 Javadoc을 살펴보면 isEmpty () 및 isNotEmpty () 메서드가 최신 버전에 여전히 존재합니다. collections15.CollectionUtils는 일반적인 지원을 제공하려는 독립적 인 프로젝트처럼 보입니다.
proko 2013-08-13

1
CollectionUtils.isEmpty ()는 선행 코드를 변경할 수없는 레거시 앱으로 작업 할 때 유용합니다.
Jerome Dalbert

1
우리는 이것을 알고 있지만 하나는 아파치 커먼즈가 아니라 구아바에 대해 묻고있었습니다.
크라에게

9

Spring Framework에는 CollectionUtils. 찾고있는 방법은 다음과 같습니다 org.springframework.util.CollectionUtils.isEmpty.. null 및 빈 컬렉션에 대해 true를 반환합니다.

그리고 배열의 경우 org.springframework.util.ObjectUtils.isEmpty거의 동일하게 작동하는 방법이 있습니다.


5
사용하는 것이 안전 할 수 있지만이 클래스는 "주로 프레임 워크 내에서 내부 용"주석으로 표시됩니다. 이것은 인터페이스가 Spring 업그레이드에서 변경 될 수 있으며 다시 작동하도록 추가 작업을 수행해야 함을 의미합니다.
Mike Minicki

2

Apache CollectionUtils 4에는 방법이 있습니다. 컬렉션이 null 인 경우 빈 목록을 반환하는 CollectionUtils.emptyIfNull () 가 있습니다. 이것은 foreach 루프에서 매우 유용하므로 반복하기 전에 null 검사를 수행 할 필요가 없습니다.


1

내 솔루션은 : MoreObjects.firstNonNull (list, Collections. emptyList ())

JDK 컬렉션과 함께 Guava MoreObjects를 사용하고 있습니다.

 @Test
public void listnull() {
List<String> list = null;

for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
    System.out.println(str);
}

list = new ArrayList<String>();
list.add("http://stackoverflow.com/");

for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
    System.out.println(str);
}
}

1
이것은 사용하지 않는 것을 제외하고 는 최상위 답변 에서 제안 된 것 ImmutableList입니다.
dimo414

하나는 NotEmpty에서 아파치 커먼즈 방법과 같은 간단하고 빠른 솔루션을 원했기 때문에 부정적이라고 생각합니다 ...
To Kra

도움말 센터> 권한> 투표 거부 언제 투표해야합니까? 심하게 조잡하고 노력이 많이 드는 게시물이나 명확하고 위험 할 정도로 잘못된 답변을 접할 때마다 비추천 투표를 사용하세요. 당신은 하루에 제한된 수의 표를 가지고 있고, 대답을 내리는 것은 당신에게 약간의 명성을 앗아갑니다. 현명하게 사용하십시오. stackoverflow.com/help/privileges/vote-down
jeton

제 답변이 "심하게 엉성하고 노력이 많이 드는 게시물 또는 명확하고 위험 할 정도로 잘못된 답변"이라고 생각하십니까? 그렇지 않다면 왜 부정적인 투표를하십니까?
jeton dec

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