source

각 루프의 반복이 시작되기 전에 늘체크를 회피하는 방법이 있나요?

factcode 2022. 9. 4. 14:27
반응형

각 루프의 반복이 시작되기 전에 늘체크를 회피하는 방법이 있나요?

수집을 반복해야 할 때마다 각 루프의 반복이 시작되기 직전에 늘이 체크됩니다.다음과 같이 합니다.

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

    }
}

"if" 블록을 쓰는 것을 피할 수 있는 더 짧은 방법이 있습니까? 주의:자바5를 사용하고 있기 때문에 당분간 사용할 수 없습니다.

가능한 경우 컬렉션이 다음과 같이 처리되지 않도록 코드를 설계해야 합니다.null애초에.

null수집은 (이 때문에) 잘못된 관행이므로 빈 수집을 사용해야 합니다.(예: )

또는 다음과 같은 기능을 구현하는 래퍼 클래스를 만들 수 있습니다.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;
  }
}

또는 텍스트 행을 저장하는 것이 우선인 경우(저장하지 않아야 함)

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

당신이 글을 쓸 수 있도록 허락해 주세요.

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

물론 이는 복잡성을 다른 곳으로 이동시킬 뿐입니다.

벌써 2017년이 되었으니 Apache Commons Collections 4를 이용하실 수 있습니다.

사용방법:

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

정답은 더 짧게 할 수 있는 방법이 없다는 것 같아요.댓글에 있는 그런 기술들이 있는데 저는 그런 기술들을 쓰고 있는 것 같지 않아요.그런 기술을 사용하는 것보다 '만약' 블록을 쓰는 게 낫다고 생각해요다시 언급하기 전에 :) 리스트가 null이 되지 않도록 코드를 디세깅해야 합니다.

Java 8에서는 다음을 사용하여 사용할 수 있는 다른 솔루션이 있습니다.java.util.Optional및 그ifPresent- - - 。

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

그래서, 정확한 문제의 해결책은 아니지만, 그것은 오넬라이너이고 아마도 더 우아할 것이다.

확장 루프의 null 검사

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

다음으로 다음을 사용합니다.

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

아파치 커먼즈

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

}           

구글 구아바

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

}

얼마나 짧게 해드릴까요?그것은 단지 두 줄의 추가일 뿐이며 명확하고 간결한 논리이다.

내 생각에 네가 결정해야 할 더 중요한 건null유효한 값인지 아닌지를 나타냅니다.유효하지 않은 경우 코드를 작성하여 이를 방지해야 합니다.그럼 이런 수표는 필요 없겠네요.만약 당신이 작업 중에 예외를 얻으러 간혹foreachloop, 이것은 코드 어딘가에 버그가 있다는 신호입니다.

1) list1이 클래스의 멤버인 경우, 컨스트럭터에 리스트를 작성합니다.이 리스트는 비어 있지만, 거기에 존재하도록 합니다.

2) for (오브젝트 obj : list1 != null ?list1 : new ArrayList())

8의 다른 은 Java 8+를 때입니다.null 추가:

public static <T> void forEach(Iterable<T> set, Consumer<T> action) {
    if (set != null) {
        set.forEach(action);
    }
}

인 정의 「」의 .foreach자바8

ArrayList<T> list = null;

//java 8+ (will throw a NullPointerException)
list.forEach(item -> doSomething(...) );

//own implementation
forEach(list, item -> doSomething(...) );

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

반응형