Stream Comparator를 활용한 내림, 오름차순 관련 정렬
People = People.stream()
.sorted(
Comparator.comparing(
(Person p) -> p.getFromMember().getGender(), Comparator.reverseOrder()
)
.thenComparing(
p -> p.getCreateDate(), Comparator.reverseOrder()
)
)
.collect(Collectors.toList());
| thenComparing | reversed |
|---|---|
| 기존 정렬순서 유지한 채로 추가 정렬 규칙 적용 | 정렬 순서를 반대로 뒤집음 |
| 이미 정렬된 상태에서 두번째 우선순위 적용 | 이미 정렬된 상태를 역순으로 뒤집음 |
-> reversed는 그냥 뒤집기만 한다..!
// thenComparing() 예제
// 이름으로 먼저 오름차순 정렬한 다음에 나이순 오름차순 정렬(기준 2개)
List<Person> sortedPeople1 = people.stream()
.sorted(
Comparator.comparing(Person::getName)
.thenComparingInt(Person::getAge)
)
.collect(Collectors.toList());
// reversed() 예제
// 이름 기준 오름차순 정렬하고 정렬 순서를 반대로 뒤집음 -> 이름 기준 내림차순 정렬
// 기존의 정렬 순서를 뒤집을 때 사용
List<Person> sortedPeople2 = people.stream()
.sorted(Comparator.comparing(Person::getName).reversed())
.collect(Collectors.toList());
-> 두 메서드의 결과를 같게도 짤 수 있지만, 정렬의 의도를 더 잘 나타내기 위해 Comparator.reverseOrder() 사용 권장
// 역순 정렬에서 동일하게 사용 예제
// 코드 기준 정렬하고 2순위로 생성일자 오름차순 한다음에 생성일순 정렬 뒤집기
// thenComparing 안에 있지만 괄호별로 줄 바꿈 등을 안하면, 뭔가 전체 다 진행하고 총 결과를 뒤집는 것으로 오해할 수 있을듯한
People = likeablePeople.stream()
.sorted(
Comparator.comparing(Person::getCode)
.thenComparing(
Comparator.comparing(Person::getCreateDate)
.reversed()
)
)
.collect(Collectors.toList());
// Comparator.reverseOrder()로 좀 더 명확하게
// 역순을 어떤 기준으로 할 지 보다 명확하게 파악 가능
likeablePeople = likeablePeople.stream()
.sorted(
Comparator.comparing(LikeablePerson::getAttractiveTypeCode)
// 2번째 인자에 넣어주면 역순 정렬 가능
.thenComparing(
Comparator.comparing(LikeablePerson::getCreateDate, Comparator.reverseOrder())
)
)
.collect(Collectors.toList());