Closed gmelon closed 1 year ago
앞에 코드14-3
을 보면 비교자 생성 메서드를 활용한 비교자가 나옵니다.
private static final Comparator<PhoneNumber> COMPARATOR =
comparingInt((PhoneNumber pn) -> pn.areaCode)
.thenComparingInt(pn -> pn.prefix)
.thenComparingInt(pn -> pn.lineNum);
이거랑 같은 방식인데 객체를 참조하는 비교자 생성 메서드 얘기이고 같은 방식으로 작동하는 것 같습니다.
첫번째는 비교자 하나만 인수로 받아 그 비교자로 부차 순서를 정한다.
는 말은 Comparator에 정의되어 있는 thenComparing 3가지 중 하나를 말하게 되는데 compring으로 처음 비교할 것을 비교한 후에 두번째, 세번째로 비교할 것을 thenComparing으로 불러와 비교하게 됩니다. 이렇게 thenComparing으로 두번째, 세번째 비교하는 것을 처음 compring으로 비교하는 것 뒤에 따라오는 부차순서들로 이해했습니다.
저번 회의 때 기대하신.... 다중정의된 thenComparing 3가지를 한번 조사해봤어요!!
Comparator thenComparing(Comparator<T> other)
Comparator thenComparing(Function<T,U> keyExtractor)
Comparator thenComparing(Function<T,U> keyExtractor, Comparator<U> keyComp)
이렇게 세 경우가 있는데
Comparator thenComparing(Comparator<T> other)
비교자 하나만 인수로 받아 그 비교자로 부차 순서를 정한다.
stuStream.sorted(Comparator.comparing(Student::getBan) //반별 정렬
.thenComparing(Comparator.reverseOrder())) //기본 반대정렬(총점 올림차순)
.forEach(System.out::println);
이렇게 기본정렬에 반대로 정렬해달라는 비교자 하나를 인수로 받아 이 비교자로 다음 순서를 결정한다는 이야기 인것 같다.
Comparator thenComparing(Function<T,U> keyExtractor)
키 추출자를 인수로 받아 그 키의 자연적 순서로 보조 순서를 정한다.
studentStream.sorted(Comparator.comparing(Student::getBan) //반별로 정렬
.thenComparing(Student::getTotalScore) //총점별로 정렬
.thenComparing(Student::getName)) //이름별로 정렬
.forEach(System.out::println);
이렇게 정렬할 키 추출자를 인수로 받아 그 키의 자연적 순서로 다음 순서를 정한다.
Comparator thenComparing(Function<T,U> keyExtractor, Comparator<U> keyComp)
키 추출자 하나와 추출된 키를 비교할 비교자까지 총 2개의 인수를 받는다.
.thenComparing(Student::getTotalScore, Comparator.reverseOrder())
이렇게 키 추출자하나와 이를 어떻게 비교할지 까지 받아 순서를 정한다.
2번에 나온 .thenComparing(Student::getName))
는 .thenComparing(Student::getName), Comparator.naturalOrder())
와 똑같은 셈..
p.93에서
인스턴스 메서드 thenComparing 3개 중 첫번째 다중정의에서 비교자 하나만 인수로 받아 그 비교자로 부차 순서를 정한다
고 했는데, 이 중부차 순서
가 뭘 의미하는지 잘 이해되지 않아서 어떻게 이해하셨는지 궁금합니다.