programing tip

for-each 루프 반복이 시작되기 전에 널 검사를 피하는 방법이 있습니까?

itbloger 2020. 8. 13. 07:58
반응형

for-each 루프 반복이 시작되기 전에 널 검사를 피하는 방법이 있습니까?


컬렉션을 반복해야 할 때마다 for-each 루프의 반복이 시작되기 직전에 null을 확인합니다. 이렇게 :

if( list1 != null ){
    for(Object obj : list1){

    }
}

"if"블록 작성을 피할 수있는 더 짧은 방법이 있습니까? 참고 : 저는 Java 5를 사용 중이며 언젠가는 그 문제를 겪을 것입니다.


가능하면 컬렉션이 null처음에 있지 않도록 코드를 디자인해야합니다 .

null수집은 나쁜 습관입니다 (이 때문에). 대신 빈 컬렉션을 사용해야합니다. (예 Collections.emptyList())

또는 Iterable컬렉션 을 구현 및 취하고 컬렉션을 처리하는 래퍼 클래스를 만들 수 null있습니다.
그런 다음 쓸 수 있습니다.foreach(T obj : new Nullable<T>(list1))


public <T extends Iterable> T nullGuard(T item) {
  if (item == null) {
    return Collections.EmptyList;
  } else {
    return item;
  }
}

당신이 쓸 수 있도록

for (Object obj : nullGuard(list)) {
  ...
}

물론 이것은 실제로 복잡성을 다른 곳으로 이동시킵니다.


정답은 그것이 더 짧게 만들 수있는 방법이 없다는 것입니다. 댓글에있는 것과 같은 몇 가지 기술이 있지만 나는 그것을 사용하지 않습니다. 이러한 기술을 사용하는 것보다 "if"블록을 작성하는 것이 더 낫다고 생각합니다. 그리고 예 .. 아무도 그것을 다시 언급하기 전에 :) "이상적으로"코드는 목록이 null이 될 수 없도록 설계되어야합니다.


이미 2017 년이며 이제 Apache Commons Collections4를 사용할 수 있습니다.

사용법 :

for(Object obj : CollectionUtils.emptyIfNull(list1)){
    // Do your stuff
}

Java 8에는 java.util.OptionalifPresent-method 를 사용하여 사용할 수있는 또 다른 솔루션이 있습니다 .

Optional.ofNullable(list1).ifPresent(l -> l.forEach(item -> {/* do stuff */}));

따라서 정확한 문제에 대한 해결책은 아니지만 하나의 라이너이며 아마도 더 우아합니다.


향상된 for 루프에서 널 검사

public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
    return iterable == null ? Collections.<T>emptyList() : iterable;
}

그런 다음 다음을 사용하십시오.

for (Object object : emptyIfNull(someList)) { ... }

Apache Commons

for (String code: ListUtils.emptyIfNull(codes)) {

}           

Google Guava

for (String code: Optional.of(codes).get()) {

}

얼마나 짧게 만들고 싶습니까? 그것은 단지 여분의 2 줄이며 명확하고 간결한 논리입니다.

결정해야 할 더 중요한 것은 null유효한 값인지 아닌지입니다. 유효하지 않은 경우 발생하지 않도록 코드를 작성해야합니다. 그러면 이런 종류의 수표가 필요하지 않습니다. foreach루프 를 수행하는 동안 예외가 발생하면 코드 어딘가에 버그가 있다는 신호입니다.


1) list1이 클래스의 멤버 인 경우 생성자에 목록을 생성하여 비어 있지만 null이 아니도록 생성합니다.

2) for (Object obj : list1! = null? list1 : new ArrayList ())

참고 URL : https://stackoverflow.com/questions/6077909/is-there-a-way-to-avoid-null-check-before-the-for-each-loop-iteration-starts

반응형