1 minute read


Sorted

스트림내 요소들에 대해서 정렬하는 작업


준비하기

  • sample data (Human)
번호 이름 가진돈 생일
1 jojae 2900 1991-02-26
2 haha 1000 2003-03-02
3 arabia 30000 2001-04-06
4 cici 150 1982-05-16
5 zzang 40000 1910-06-26
6 ssu 200000 2012-07-11
7 kuku 150 1991-02-27
public class Human {
    private Long idx;
    private String name;
    private Integer money;
    private LocalDate birth;
}

기본 사용법

기본적으로 sorted를 사용하려면 정렬하려는 객체에 Comparable 인터페이스가 구현되어 있어야함.

  • Comparable 구현
    public class Human implements Comparable<Human> {
    
      ...
    
      @Override
      public int compareTo(Human o) {
          return this.name.compareTo(o.name);
      }
    }
    
@DisplayName("이름 사전순 정렬")
void sortedTest1() {
    printHumans(humans);

    List<Human> sortedHumans = humans.stream()
            .sorted()
            .collect(Collectors.toList());

    printHumans(sortedHumans);
}
  • 결과
    jojae haha arabia cici zzang ssu kuku
    arabia cici haha jojae kuku ssu zzang
    

역순으로 정렬하기

sorted의 파라미터로 Comparator.reverseOrder()를 넘겨주면 됨.

@DisplayName("이름 사전 역순 정렬")
void sortedTest2() {
    printHumans(humans);

    List<Human> sortedHumans = humans.stream()
            .sorted(Comparator.reverseOrder())
            .collect(Collectors.toList());

    printHumans(sortedHumans);
}
  • 결과
    jojae haha arabia cici zzang ssu kuku
    zzang ssu kuku jojae haha cici arabia
    

Comparator 파라미터로 넘겨서 정렬하기

객체에 정의된 compareTo가 아닌 정렬기준을 직접 넘기고 싶으면 직접 Comparator 를 구현해서 넘겨주면 됨.

@DisplayName("돈 순으로 정렬")
void sortedTest3() {
    printHumans(humans);

    List<Human> sortedHumans = humans.stream()
            .sorted(Comparator.comparingInt(Human::getMoney))
            .collect(Collectors.toList());

    printHumans(sortedHumans);
}
  • 결과
    jojae haha arabia cici zzang ssu kuku
    cici kuku haha jojae arabia zzang ssu
    

Comparator 파라미터로 넘겨서 정렬하기 (역순)

마찬가지로 .reverseOrder 를 사용해주면 됨.

@DisplayName("돈 순으로 정렬 (역순)")
void sortedTest4() {
    printHumans(humans);

    List<Human> sortedHumans = humans.stream()
            .sorted(Comparator.comparingInt(Human::getMoney).reversed())
            .collect(Collectors.toList());

    printHumans(sortedHumans);
}
  • 결과
    jojae haha arabia cici zzang ssu kuku
    ssu zzang arabia jojae haha cici kuku
    

람다 표현식을 사용하여 정렬

람다 표현식을 사용해서 정렬하는것도 가능하다.
(하지만 idea에서 아래처럼 replace 권고함.)
Comparator.comparingInt(Human::getMoney)

@DisplayName("람다 표현식을 사용하여 정렬")
void sortedTest5() {
    printHumans(humans);

    List<Human> sortedHumans = humans.stream()
            .sorted((h1, h2) -> h1.getMoney() - h2.getMoney())
            .collect(Collectors.toList());

    printHumans(sortedHumans);
}
  • 결과
    jojae haha arabia cici zzang ssu kuku
    cici kuku haha jojae arabia zzang ssu
    

Comments