March
1st,
2015
본 포스트의 원문은 http://www.baeldung.com에서 확인할 수 있으며 원 저작자의 번역 포스팅 허락을 받았음을 알려드립니다.
이번 예제는 List에서 null 를 제거하는 방법에 대해 살펴보겠습니다. - 처음에는 plain java를 활요하여, 그리고 Guava를 활용하여 마지막으로 Java 8 의 Lambda 기반 해결법을 살펴보겠습니다.
이 포스트는 Baeldung 사이트의 “Java – Back to Basic” 시리즈입니다.
1. plain java를 사용한 null 요소 제거
Java Collections 프레임워크에서 list의 null 요소를 제거할 수 있는 간단한 방법을 제공하고 있습니다. - while 루프
@Test
public void givenListContainsNulls_whenRemovingNullsWithPlainJava_thenCorrect() {
List<Integer> list = Lists.newArrayList(null, 1, null);
while (list.remove(null));
assertThat(list, hasSize(1));
}
또 다른 간단한 방법도 있습니다.
@Test
public void givenListContainsNulls_whenRemovingNullsWithPlainJavaAlternative_thenCorrect() {
List<Integer> list = Lists.newArrayList(null, 1, null);
list.removeAll(Collections.singleton(null));
assertThat(list, hasSize(1));
}
두 방법 모두 원래의 리스트가 변경됩니다.
2. Guava를 활용한 null 요소 제거
Guava에서도 predicates
를 통해 null을 제거할 수 있는 방법을 제공합니다.
@Test
public void givenListContainsNulls_whenRemovingNullsWithGuavaV1_thenCorrect() {
List<Integer> list = Lists.newArrayList(null, 1, null);
Iterables.removeIf(list, Predicates.isNull());
assertThat(list, hasSize(1));
}
만약 원래 리스트를 변경하지 않고 null만 제거된 리스트만 별도로 만들고 싶을 경우 Guava를 통해 새로 생성하여 list에 filter를 적용하면 됩니다.
@Test
public void givenListContainsNulls_whenRemovingNullsWithGuavaV2_thenCorrect() {
List<Integer> list = Lists.newArrayList(null, 1, null, 2, 3);
List<Integer> listWithoutNulls = Lists.newArrayList(
Iterables.filter(list, Predicates.notNull()));
assertThat(listWithoutNulls, hasSize(3));
}
3. Apache Commons Collections를 활용한 null 제거
이제는 Apache Commons Collections library에서도 비슷한 기능을 활용하는 방법을 살펴보겠습니다.:
@Test
public void givenListContainsNulls_whenRemovingNullsWithCommonsCollections_thenCorrect() {
List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null);
CollectionUtils.filter(list, PredicateUtils.notNullPredicate());
assertThat(list, hasSize(3));
}
위 방법은 원래의 리스트가 변경됩니다.
4. Lambdas를 활용한 null 요소 제거(Java 8)
마지막으로 Java 8의 Lambdas의 filter를 활용한 방법을 살펴보겠습니다. 필터링은 parallel이나 serial로 처리할 수 있습니다.
public void givenListContainsNulls_whenFilteringParallel_thenCorrect() {
List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null);
List<Integer> listWithoutNulls =
list.parallelStream().filter(i -> i != null).collect(Collectors.toList());
}
public void givenListContainsNulls_whenFilteringSerial_thenCorrect() {
List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null);
List<Integer> listWithoutNulls =
list.stream().filter(i -> i != null).collect(Collectors.toList());
}
지금까지 List에서 null 요소를 제거할 수 있는 간단하고 유용한 방법들을 살펴봤습니다.