정렬


스트림은 요소가 최종 처리되기 전에 중간 단계에서 요소를 정렬해서 최종 처리 순서를 변경할 수 있다. 요소를 정렬하는 메소드는 다음과 같다.



리턴 타입 메소드(매개 변수) 설명
Stream<T> sorted() 객체를 Xomparable 구현 방법에 따라 정렬
Stream<T> sorted(Comparator<T>) 객체를 주어진 Comparator에 따라 정렬
DoubleStream sorted() double 요소를 오름차순으로 정렬
IntStream() sorted() int 요소를 오름차순으로 정렬
LongStream sorted() long 요소를 오름차순으로 정렬



객체 요소일 경우에는 클래스가 Comparable을 구현하지 않으면 sorted() 메소드를 호출했을 때 ClassCastException이 발생하기 때문에 Comparable을 구현한 요소에서만 sorted() 메소드를 호출해야 한다.


public class Student implements Comparable<Student> {
  private String name;
  private int score;

  public Student(String name, int score) {
    this.name = name;
    this.score = score;
  }

  public String getName(){return name;}
  public int getScore(){return score;}

  @Override
  public int comparaTo(Student o){
    return Integer.compare(score, o.getScore);
  }
}
// 오름차순
sorted();
sorted( (a,b) -> a.compareTo(b) );
sorted( Comparator.naturalOrder() ); // 객체에서 compareTo 함수를 구현하지 않았을 경우

// 내림차순
sorted( (a,b) -> b.compareTo(a) );
sorted( Comparator.reverseOrder() );


Arrays 의 숫자를 아래와 같이 정렬할 수 있다.


import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.IntStream;


public class SortingExample {
  public static void main(String[] args){
    //숫자 요소일 경우
    IntStream intStream = Arrays.stream(new int[] {5, 3, 2, 1, 4});
    intStream
      .sorted()
      .forEach(n -> System.out.print(n + ","))l

    System.out.println();
  }
}