HOME > java > java8

Java8의 Stream sorted 사용 방법

By JS|14 Jul 2018

sorted()

sorted는 스트림의 아이템들을 정렬하여 새로운 스트림을 생성합니다. sorted()는 param이 없습니다. 그렇기 때문에 이를 사용하려면 정렬하려는 객체에 Comparable 인터페이스가 구현되어있어야 사용이 가능합니다. String은 기본적으로 Comparable이 구현되어 있습니다. 그렇게 때문에 아래 코드는 정상적으로 동작합니다.

String의 Comparable은 String.compareTo()로 구현된 것 같습니다. 결과를 보면 알파벳 순서대로 정렬이 되었네요. 만약 역순으로 정렬을 하고싶다면 인자에 Comparator.reverseOrder()를 넣으면 됩니다.

List<String> langs =
        Arrays.asList("java", "kotlin", "haskell", "ruby", "smalltalk");
System.out.println("sorted:");
langs.stream().sorted()
        .forEach(System.out::println);

System.out.println("reversed:");
langs.stream().sorted(Comparator.reverseOrder())
        .forEach(System.out::println);

결과

sorted:
haskell
java
kotlin
ruby
smalltalk

reversed:
smalltalk
ruby
kotlin
java
haskell

sorted(Comparator)

정렬하려는 객체가 Comparable 인터페이스를 구현하지 않았다면 sorted(Comparator)를 사용하면 됩니다. 이 경우 Comparator를 정의해야 합니다.

아래 코드는 sorted의 param을 Comparator.comparing(String::length)로 설정하였습니다. 이것은 스트링의 길이를 비교하는 Comparator를 생성합니다. 역순으로 정렬하려면 .reversed()를 붙이면 됩니다.

List<String> langs =
        Arrays.asList("java", "kotlin", "haskell", "ruby", "smalltalk");

System.out.println("sorted:");
langs.stream().sorted(Comparator.comparing(String::length))
        .forEach(System.out::println);

System.out.println("reversed:");
langs.stream().sorted(Comparator.comparing(String::length).reversed())
        .forEach(System.out::println);

결과

sorted:
java
ruby
kotlin
haskell
smalltalk

reversed:
smalltalk
haskell
kotlin
java
ruby

이번에는 직접 Comparator를 구현하였습니다. String의 length를 비교하여 위와 동일한 동작을 하도록 하였습니다.

List<String> langs =
        Arrays.asList("java", "kotlin", "haskell", "ruby", "smalltalk");

System.out.println("sorted:");
final Comparator<String> comp = (p1, p2) -> Integer.compare( p1.length(), p2.length());
langs.stream().sorted(comp)
        .forEach(System.out::println);

System.out.println("reversed:");
langs.stream().sorted(comp.reversed())
        .forEach(System.out::println);

결과

sorted:
java
ruby
kotlin
haskell
smalltalk

reversed:
smalltalk
haskell
kotlin
java
ruby

sorted() + custom class

이번에는 Comparable을 구현한 class를 정의하였고 sorted()를 사용하여 스트림을 정렬해보았습니다. MyString의 compareTo() 메소드 구현부를 보면 Integer.compare()로 스트링의 길이를 비교하였습니다. 짧은 순서대로 정렬되었네요.

List<MyString> langs2 =
        Arrays.asList(new MyString("java"), new MyString("kotlin"),
                new MyString("haskell"), new MyString("ruby"),
                new MyString("smalltalk"));

langs2.stream().sorted()
        .forEach(System.out::println);


// MyString class 정의
public static class MyString implements Comparable<MyString> {
    public String str;

    public MyString(String str) {
        this.str = str;
    }

    @Override
    public int compareTo(MyString o) {
        return Integer.compare(this.str.length(), o.str.length());
    }

    @Override
    public int hashCode() {
        return str.hashCode();
    }

    @Override
    public String toString() {
        return str;
    }

}

결과

java
ruby
kotlin
haskell
smalltalk