Comparator 인터페이스의 유용한 정적 메소드 (static method)를 소개하고자 한다.

 

우선 comparing이라는 메소드의 인자는 Function 타입이다. 따라서 주로 람다식이나 메소드참조를 이용한다.

static 메소드는 메소드 이름 앞에 클래스 이름(또는 인터페이스 이름)까지 붙여서 외우는 것이 좋다.

Comparator.comparing(Function 객체) 이렇게 통째로 기억해 두자.

 

그리고 thenComparing이라는 메소드도 있다.

이름만 들어도 짐작이 가겠지만 어떤 기준으로 정렬한 후 그래도 똑같다면 이 기준으로 정렬하라는 것이다.

이 메소드의 인자는 Function 객체를 넣어도 되고 Comparator 객체를 넣어도 된다. 따라서 이 메소드도 인자로 람다식이나 메소드 참조가 주로 들어간다.

thenComparing 메소드는 이 뒤에도 계속 thenComparing(기준).thenComparing(기준) 이런 식으로 메소드 체이닝이 가능하다. thenComparing 메소드의 반환타입도 Comparator이기 때문이다.

import java.util.Arrays;
import java.util.Comparator;

public class PersonTest {
    public static void main(String[] args) {
        Person[] list = {new Person("홍길동", 30), new Person("황진이", 20), new Person("이몽룡", 30)};
        Arrays.sort(list, Comparator.comparing(Person::getAge).thenComparing(Person::getName));
        for (Person p : list) {
            System.out.println(p);
        }
    }
}
class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

나이순으로 정렬하되 나이가 같은 경우 이름순으로 정렬된 것을 볼 수 있다.

+ Recent posts