2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

[Item 14] thenComparing 와 부차 순서 #50

Closed gmelon closed 1 year ago

gmelon commented 1 year ago

p.93에서 인스턴스 메서드 thenComparing 3개 중 첫번째 다중정의에서 비교자 하나만 인수로 받아 그 비교자로 부차 순서를 정한다 고 했는데, 이 중 부차 순서가 뭘 의미하는지 잘 이해되지 않아서 어떻게 이해하셨는지 궁금합니다.

ssstopeun commented 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으로 비교하는 것 뒤에 따라오는 부차순서들로 이해했습니다.

ssstopeun commented 1 year ago

저번 회의 때 기대하신.... 다중정의된 thenComparing 3가지를 한번 조사해봤어요!!

Comparator thenComparing(Comparator<T> other)
Comparator thenComparing(Function<T,U> keyExtractor)
Comparator thenComparing(Function<T,U> keyExtractor, Comparator<U> keyComp)

이렇게 세 경우가 있는데

1. Comparator thenComparing(Comparator<T> other)

비교자 하나만 인수로 받아 그 비교자로 부차 순서를 정한다.

stuStream.sorted(Comparator.comparing(Student::getBan)  //반별 정렬
        .thenComparing(Comparator.reverseOrder()))  //기본 반대정렬(총점 올림차순)
        .forEach(System.out::println);

이렇게 기본정렬에 반대로 정렬해달라는 비교자 하나를 인수로 받아 이 비교자로 다음 순서를 결정한다는 이야기 인것 같다.


2. Comparator thenComparing(Function<T,U> keyExtractor)

키 추출자를 인수로 받아 그 키의 자연적 순서로 보조 순서를 정한다.

studentStream.sorted(Comparator.comparing(Student::getBan)  //반별로 정렬
                .thenComparing(Student::getTotalScore)  //총점별로 정렬
                .thenComparing(Student::getName))   //이름별로 정렬
            .forEach(System.out::println);

이렇게 정렬할 키 추출자를 인수로 받아 그 키의 자연적 순서로 다음 순서를 정한다.


3. Comparator thenComparing(Function<T,U> keyExtractor, Comparator<U> keyComp)

키 추출자 하나와 추출된 키를 비교할 비교자까지 총 2개의 인수를 받는다.

.thenComparing(Student::getTotalScore, Comparator.reverseOrder())

이렇게 키 추출자하나와 이를 어떻게 비교할지 까지 받아 순서를 정한다.

2번에 나온 .thenComparing(Student::getName)).thenComparing(Student::getName), Comparator.naturalOrder()) 와 똑같은 셈..