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.Optional
및 ifPresent
-method 를 사용하여 사용할 수있는 또 다른 솔루션이 있습니다 .
Optional.ofNullable(list1).ifPresent(l -> l.forEach(item -> {/* do stuff */}));
따라서 정확한 문제에 대한 해결책은 아니지만 하나의 라이너이며 아마도 더 우아합니다.
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 ())
'programing tip' 카테고리의 다른 글
Create-React-App 기반 프로젝트에 글꼴을 추가하는 방법은 무엇입니까? (0) | 2020.08.13 |
---|---|
Oracle SQL Developer에서 변수를 어떻게 사용합니까? (0) | 2020.08.13 |
언제 뮤텍스를 사용해야하고 언제 세마포어를 사용해야합니까? (0) | 2020.08.13 |
LaTeX에서 \ include 후 페이지 나누기가없는 방법 (0) | 2020.08.12 |
리베이스를 수행 한 후 Git 커밋이 동일한 분기에 복제됩니다. (0) | 2020.08.12 |