본문으로 바로가기

1. NullPointerException 

  • 정렬 시 데이터에 null이 포함되어 있을 경우 NullPointerException이 발생하게 됩니다.
List<Integer> numberList = Arrays.asList(1, null, 3, 4, null, 2);

// 숫자 리스트 오름차순 정렬
numberList.stream()
        .sorted(Comparator.naturalOrder())
        .forEach(System.out::println);

2. nullsFirst() / nullsLast()

  • Comparator 함수형 인터페이스의 static 메소드인 nullsFirst() / nullsLast()를 이용하면 정렬 시 발생하는 NullPointerException를 처리할 수 있습니다.
  • nullsFirst() / nullsLast() : null 데이터는 맨 앞에 정렬 / null 데이터는 맨 뒤에 정렬
@FunctionalInterface
public interface Comparator<T> {
    public static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) {
        return new Comparators.NullComparator<>(true, comparator);
    }

    public static <T> Comparator<T> nullsLast(Comparator<? super T> comparator) {
        return new Comparators.NullComparator<>(false, comparator);
    }
}

 

1. List<Integer> null 처리

List<Integer> numberList = Arrays.asList(1, null, 3, 4, null, 2);

// 숫자 리스트 오름차순 정렬 + null 데이터는 맨 앞으로 정렬
numberList.stream()
        .sorted(Comparator.nullsFirst(Comparator.naturalOrder()))
        .forEach(System.out::println);
/*
[출력결과]
null
null
1
2
3
4
*/

// 숫자 리스트 오름차순 정렬 + null 데이터는 맨 뒤로 정렬
numberList.stream()
        .sorted(Comparator.nullsLast(Comparator.naturalOrder()))
        .forEach(System.out::println);
/*
[출력결과]
1
2
3
4
null
null
*/

 

2. List<Student> null 처리

[Student 클래스 생성]

public class Student {

    int age;
    String name;
    ClassName className;

    public enum ClassName {
        A, B, C
    }

    Student(int age, String name, ClassName className) {
        this.age = age;
        this.name = name;
        this.className = className;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public ClassName getClassName() {
        return className;
    }
}

 

[null 처리]

List<Student> students = Arrays.asList(
        new Student(2, "Kim", Student.ClassName.A),
        new Student(3, "Shin", Student.ClassName.B),
        new Student(3, "Lee", null),
        new Student(2, "Kang", null),
        new Student(1, "Chul", Student.ClassName.A),
        new Student(1, "Jang", Student.ClassName.B),
        new Student(3, "Ahn", Student.ClassName.A),
        new Student(1, "Hawng", null),
        new Student(2, "Lim", Student.ClassName.B)
);
// 반 이름 정렬(오름차순) + nullsFirst
Comparator<Student> nullFirst = Comparator
        .comparing(Student::getClassName, Comparator.nullsFirst(Comparator.naturalOrder()));

students.stream()
        .sorted(nullFirst)
        .forEach(o -> {
            System.out.println(o.getAge() + " : " + o.getName() + " : " + o.getClassName());
        });
// 반 이름 정렬(오름차순) + nullsLast
Comparator<Student> nullLast = Comparator
        .comparing(Student::getClassName, Comparator.nullsLast(Comparator.naturalOrder()));

students.stream()
        .sorted(nullLast)
        .forEach(o -> {
            System.out.println(o.getAge() + " : " + o.getName() + " : " + o.getClassName());
        });