Java에서 Stream.sorted()는 스트림의 요소들을 정렬하는데 사용하는 메소드입니다.

이 메소드를 사용하여 스트림의 요소들을 정렬할 수 있습니다.

Stream.sorted()로 스트림 정렬

아래 예제는 동일한 스트림에 대해서, 한번은 sorted()를 사용하지 않고 요소들을 출력하고, 한번은 사용하고 출력합니다.

sorted()를 호출함으로써, 스트림의 요소들이 오름차순으로 정렬되는 것을 볼 수 있습니다.

import java.util.stream.Stream;

public class Example {

    public static void main(String[] args) {

        Stream<Integer> numbers = Stream.of(3, 1, 4, 1, 5);

        System.out.println("정렬되지 않은 스트림:");
        numbers.forEach(System.out::println);

        Stream<Integer> sortedNumbers = Stream.of(3, 1, 4, 1, 5).sorted();

        System.out.println("\n오름차순으로 정렬된 스트림:");
        sortedNumbers.forEach(System.out::println);
    }
}

Output:

정렬되지 않은 스트림:
3
1
4
1
5

오름차순으로 정렬된 스트림:
1
1
3
4
5

예제 1. 내림차순으로 정렬

스트림에 인자 없이 sorted()를 호출하면 객체에 정의된 Comparator를 사용하여 비교합니다. 일반적으로 오름차순으로 정렬되도록 구현되어있습니다.

만약 내림차순으로 정렬하고 싶다면, 정렬 규칙을 의미하는 Comparator를 직접 구현하여 sorted()에 인자로 전달해야 합니다.

아래 예제는 내림차순으로 정렬합니다.

  • sorted((num1, num2) -> num2.compareTo(num1)) : 두개의 숫자를 내림차순으로 정렬되도록 비교
import java.util.stream.Stream;

public class Example {

    public static void main(String[] args) {

        Stream<Integer> numbers = Stream.of(3, 1, 4, 1, 5);
        numbers.sorted((num1, num2) -> num2.compareTo(num1)).forEach(System.out::println);
    }
}

Output:

5
4
3
1
1

예제 2. 문자열 스트림을 sorted()로 정렬

Integer 스트림뿐만 아니라 문자열 스트림도 sorted()로 정렬할 수 있으며, 알파벳 순서대로, 오름차순으로 정렬됩니다. 내림차순으로 정렬하려면 comparator를 직접 구현해서 인자로 전달해야 합니다.

import java.util.stream.Stream;

public class Example {

    public static void main(String[] args) {

        Stream<String> words = Stream.of("apple", "banana", "cherry", "date");
        words.sorted().forEach(System.out::println);
    }
}

Output:

apple
banana
cherry
date

예제 3. Custom class의 스트림 정렬

String, Integer 같은 기본 자료형 외에, 직접 정의한 Custom class 객체의 스트림도 sorted()로 정렬할 수 있습니다.

Custom class에 Comparable가 구현되어있지 않은 경우 어떻게 비교할지 모르기 때문에, sorted()에 인자로 Comparator 구현부를 전달해야 합니다.

  • sorted()의 인자로 comparator 전달, Person 객체의 name 값을 오름차순으로 비교
  • (p1, p2) -> p1.getName().compareTo(p2.getName()) : 객체의 이름을 오름차순으로 비교하여 정렬
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class Example {

    public static void main(String[] args) {

        Stream<Person> people = Stream.of(new Person("Alice"),
                new Person("Charlie"),
                new Person("Bob"));

        List<Person> sortedPeople = people.sorted(
                (p1, p2) -> p1.getName().compareTo(p2.getName())).collect(Collectors.toList());
        sortedPeople.forEach(person -> System.out.println(person.getName()));
    }
}

Output:

Alice
Bob
Charlie

예제 4. Comparable이 구현된 Custom class

Custom class 스트림을 정렬할 때, Comparator를 전달하지 않고 sorted()만 호출하여 동작하도록 하려면, Custom 클래스에 Comparable을 구현해야 합니다.

아래 예제는 Person 클래스에 Comparable을 구현하였으며, Comparator 전달 없이 sorted()만 호출하여 정렬합니다.

  • class Person implements Comparable<Person> : Comparable 구현
  • this.getName().compareTo(person.getName()) : 이름을 오름차순으로 비교
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

class Person implements Comparable<Person> {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public int compareTo(Person person) {
        return this.getName().compareTo(person.getName());
    }
}

public class Example {

    public static void main(String[] args) {

        Stream<Person> people = Stream.of(new Person("Alice"),
                new Person("Charlie"),
                new Person("Bob"));

        List<Person> sortedPeople = people.sorted().collect(Collectors.toList());
        sortedPeople.forEach(person -> System.out.println(person.getName()));
    }
}

Output:

Alice
Bob
Charlie