자바 8부터 Comparator 인터페이스에 유용한 메서드가 상당수 포함됐다. 이 중 하나가 comparingInt()다. 이 메서드는 제네릭 타입으로부터 int 정렬 키를 추출하는 함수를 입력으로 받아 그 정렬 키로 비교하는 Comparator<T>를 반환한다. 현재 Comparator 값을 뒤집는 reversed() 메서드도 상당히 유용하다.
두 메서드를 사용하면 다음과 같이 Arrays.sort()에 정렬을 맡길 수 있다.
public static void sortArrayByLength(String[] strs, Sort direction) {
if (direction.equals(Sort.ASC)) {
Arrays.sort(strs, Comparator.comparingInt(String::length));
} else {
Arrays.sort(strs,
Comparator.comparingInt(String::length).reversed());
}
}
Info ≣ 비교자를 서로 이으려면(메서드 체인) thenComparing() 메서드를 사용한다.
앞선 해법들은 받은 배열 그대로 정렬하므로 void를 반환한다. 새로운 배열을 정렬해서 반환하고 주어진 배열을 변경하지 않으려면 다음 코드처럼 자바 8 함수형 스타일을 사용한다.
public static String[] sortArrayByLength(String[] strs, Sort direction) {
if (direction.equals(Sort.ASC)) {
return Arrays.stream(strs)
.sorted(Comparator.comparingInt(String::length))
.toArray(String[]::new);
} else {
return Arrays.stream(strs)
.sorted(Comparator.comparingInt(String::length).reversed())
.toArray(String[]::new);
}
}
위 코드는 주어진 배열로부터 스트림을 생성해 sorted() 스테이트풀 중간 연산으로 정렬한 후 그 결과를 또 다른 배열 안에 모은다.