Comparable과 Comparator의 훌륭한 설명은
https://st-lab.tistory.com/243 이 글을 참고
public class Person implements Comparable {
private String firstName;
private String lastName;
private int age;
}
Person 클래스가 있을 때 여러 개의 Person클래스를 성, 이름, 나이로 정렬할 수 있다.
스트림의 .sorted()는 Comparator의 구현체가 들어가야한다.
@FunctionalInterface
public interface Comparator<T>{
int compare(T o1, T o2);
Comparator은 함수형 인터페이스로 sorted()에서 사용하려면 compare를 구현해야한다.
람다식으로 표현하여 구현하면 다음과 같이 쓸 수 있다.
.sorted((p1,p2) -> p1.getAge().compareTo(p2.getAge()))
comparing()은 Comparator의 default함수이다.
반환값으로 compare가 구현된 Comparator가 나온다.
위에서 봤던 sorted안의 Comparator를 comparing()을 활용해 다음과 같이 쓸 수 있다.
.sorted(Comparator.comparing(p -> p.getAge()))
이 경우 나이를 compareTo()로 비교하는 compare함수가 될 것 이다.
참조식을 사용하면 다음과 같이 표현 가능하다.
.sorted(Comparator.comparing(Person::getAge))
그런데 여기서 나이순으로 정렬한 후 이름순으로 다시 정렬하고 싶다면 어떻게 해야할까?
이때 comparing이 빛을 발할 수 있다. comparing의 리턴은 Comparator이므로 이 뒤에 thenComparing()을 또 쓸 수 있다.
.sorted(Comparator.comparing(Person::getAge).thenComparing(Person::getFirstName))
primitive의 변수들은 Comparator의 compare를 compareTo()함수를 이용해서 구현하여 sort에 사용하면되고
정렬기준이 없는 객체 중 1개의 비교 포인트라면 Comparator의 compare를 구현해서 쓰면되고 2개 이상의 비교 표인트라면 Comparator의 comparing() 그리고 thenComparing을 쓰면 되겠다.