[Java8] 스트림에서 Comparator 사용하기

maxxyoung·2022년 8월 11일
0

Comparable과 Comparator의 훌륭한 설명은
https://st-lab.tistory.com/243 이 글을 참고

상황

public class Person implements Comparable {
    private String firstName;
    private String lastName;
    private int age;
}

Person 클래스가 있을 때 여러 개의 Person클래스를 성, 이름, 나이로 정렬할 수 있다.

Comparator의 compare()

스트림의 .sorted()는 Comparator의 구현체가 들어가야한다.

@FunctionalInterface
public interface Comparator<T>{
  int compare(T o1, T o2);

Comparator은 함수형 인터페이스로 sorted()에서 사용하려면 compare를 구현해야한다.
람다식으로 표현하여 구현하면 다음과 같이 쓸 수 있다.

.sorted((p1,p2) -> p1.getAge().compareTo(p2.getAge()))

Comparator의 comparing()

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을 쓰면 되겠다.

profile
오직 나만을 위한 글. 틀린 부분 말씀해 주시면 감사드립니다.

0개의 댓글