[JAVA] List Array Null 체크하는 3가지 방법 - Map 데이터 정렬, ResponseEntity JSON return
개발을 하다 보면 List 데이터에 값이 있는지, 없는지 체크하는 로직을 구현하는 경우가 많다.
데이터베이스의 selectList를 통해 얻어온 값을 체크하거나, ArrayList를 생성하고 값이 있는지 체크하는 경우이다.
List가 Null이라는 건, 인스턴스가 생성되지 않았으므로 메모리에서 참조하는 주소값이 없다는 것이다.
일반적으로 List==null 로 비교하거나 isEmpty 또는 size로 비교하는 경우가 대부분일 것이다.
두 가지 방법을 제외하고 Spring에서 Apache Commons 라이브러리를 참조하는 CollectionUtils.isEmpty 를 사용하는 방법을 알아보려고 한다.
먼저, Null 체크 하는 소스코딩을 아래에 먼저 구현해 놓았다.
/**
* list Empty Check
* @param req
* @param res
* @return
*/
@GetMapping(value="/listEmpty", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Map<String, Object>> listEmpty(HttpServletRequest req, HttpServletResponse res){
Map<String, Object> map = new HashMap<>();
// 1. Null 또는 isEmpty로 체크
List<String> arr = Arrays.asList("aa", "bb", "cc", "dd");
if(arr == null || arr.isEmpty()) {
map.put("arr", "list is empty");
}
List<String> arr1 = new ArrayList<>();
if(arr1 == null || arr1.isEmpty()) {
map.put("arr1", "list1 is empty");
}
List<String> arr2 = new ArrayList<>();
if(arr2 == null || arr2.isEmpty()) {
map.put("arr2", "list2 is empty");
}
map.forEach((k, v) -> System.out.println(k + "=" + v));
// 2. Null 또는 size 로 체크
List<String> arr3 = Arrays.asList("ee", "ff", "gg", "hh");
if(arr3 == null || arr3.size() == 0) {
map.put("arr3", "list3 is empty");
}
List<String> arr4 = new ArrayList<>();
if(arr4 == null || arr4.size() == 0) {
map.put("arr4", "list4 is empty");
}
List<String> arr5 = new ArrayList<>();
if(arr5 == null || arr5.size() == 0) {
map.put("arr5", "list5 is empty");
}
// 3. CollectionUtils 체크
List<String> arr6 = Arrays.asList("ee", "ff", "gg", "hh");
if(CollectionUtils.isEmpty(arr6)) {
map.put("arr6", "list6 is empty");
}
List<String> arr7 = new ArrayList<>();
if(CollectionUtils.isEmpty(arr7)) {
map.put("arr7", "list7 is empty");
}
List<String> arr8 = new ArrayList<>();
if(CollectionUtils.isEmpty(arr8)) {
map.put("arr8", "list8 is empty");
}
map.forEach((k, v) -> System.out.println(k + "=" + v));
// value 값으로 정렬
List<Entry<String, Object>> list = new LinkedList<>(map.entrySet());
Collections.sort(list, new Comparator<Object>() {
@SuppressWarnings("unchecked")
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
return ((Comparable<String>) ((Map.Entry<String, Object>) (o1)).getValue()).compareTo( (String) ((Map.Entry<String, Object>) (o2)).getValue() );
}
});
Map<String, Object> result = new LinkedHashMap<>();
for( Iterator<Entry<String, Object>> it = list.iterator(); it.hasNext(); ) {
Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it.next();
result.put(entry.getKey(), entry.getValue());
}
result.forEach((k, v) -> System.out.println(k + "=" + v));
return new ResponseEntity<Map<String,Object>>(result, HttpStatus.OK);
}
1. isEmpty를 사용하여 Null 체크하기
아래 소스는 Null 또는 isEmpty로 체크하는 방법이다.
isEmpty를 사용하면 직관적인 소스코딩이 가능하고 size로 계산할 때 보다 시간복잡도가 적다.
// 1. Null 또는 isEmpty로 체크
List<String> arr = Arrays.asList("aa", "bb", "cc", "dd");
if(arr == null || arr.isEmpty()) {
map.put("arr", "list is empty");
}
List<String> arr1 = new ArrayList<>();
if(arr1 == null || arr1.isEmpty()) {
map.put("arr1", "list1 is empty");
}
List<String> arr2 = new ArrayList<>();
if(arr2 == null || arr2.isEmpty()) {
map.put("arr2", "list2 is empty");
}
map.forEach((k, v) -> System.out.println(k + "=" + v));
2. size를 비교하여 Null 체크하기
아래 소스는 size로 Null 체크를 하는 로직이다.
size()로 계산할 경우 시간복잡도가 O(N) 이므로 시간 비용이 많이 소요된다.
// 2. Null 또는 size 로 체크
List<String> arr3 = Arrays.asList("ee", "ff", "gg", "hh");
if(arr3 == null || arr3.size() == 0) {
map.put("arr3", "list3 is empty");
}
List<String> arr4 = new ArrayList<>();
if(arr4 == null || arr4.size() == 0) {
map.put("arr4", "list4 is empty");
}
List<String> arr5 = new ArrayList<>();
if(arr5 == null || arr5.size() == 0) {
map.put("arr5", "list5 is empty");
}
3. CollectionUtils.isEmpty 로 Null 체크하기
아래 소스는 CollectionUtils.isEmpty 로 Null 체크하는 로직이다.
// 3. CollectionUtils 체크
List<String> arr6 = Arrays.asList("ee", "ff", "gg", "hh");
if(CollectionUtils.isEmpty(arr6)) {
map.put("arr6", "list6 is empty");
}
List<String> arr7 = new ArrayList<>();
if(CollectionUtils.isEmpty(arr7)) {
map.put("arr7", "list7 is empty");
}
List<String> arr8 = new ArrayList<>();
if(CollectionUtils.isEmpty(arr8)) {
map.put("arr8", "list8 is empty");
}
map.forEach((k, v) -> System.out.println(k + "=" + v));
CollectionUtils.isEmpty() 함수 안에 들어가보면, 1번에서 소개했던 isEmpty 로 체크하는 로직이 구현되어 있다.
nul 체크와 isEmpty()를 동시에 실행하고 있으므로 CollectionsUtils.isEmpty를 사용해서 NullPointException을 꼭 회피하도록 하자.
/**
* Return {@code true} if the supplied Collection is {@code null} or empty.
* Otherwise, return {@code false}.
* @param collection the Collection to check
* @return whether the given Collection is empty
*/
public static boolean isEmpty(@Nullable Collection<?> collection) {
return (collection == null || collection.isEmpty());
}