Java 8에서 도입된 Stream의 Stream.sorted()
사용 방법 및 예제를 소개합니다.
1. Stream.sorted()
Stream.sorted()
는 스트림의 요소들이 어떤 기준으로 정렬되어 전달되는 새로운 스트림 객체를 리턴합니다.
Stream.sorted()
에서 요소들을 어떻게 정렬해야하는지에 대한 내용은 Comparable 또는 Comparator에 구현되어야 합니다.
아래 예제에서 사용된 String
은 기본적으로 Comparable이 구현되어 있습니다. 그렇기 때문에 Comparator를 따로 구현할 필요는 없습니다.
실행 결과를 보면 문자열들이 알파벳 순서대로 정렬되었습니다. 만약 역순으로 정렬을 하고싶다면 인자에 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);
Output:
sorted:
haskell
java
kotlin
ruby
smalltalk
reversed:
smalltalk
ruby
kotlin
java
haskell
2. Stream.sorted(Comparator)
만약 Stream의 요소가 Comparable 인터페이스를 구현하지 않았다면 Stream.sorted(Comparator)
처럼 Comparator를 구현하여 인자로 전달하면 됩니다.
아래 예제는 Comparator로 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);
Output:
sorted:
java
ruby
kotlin
haskell
smalltalk
reversed:
smalltalk
haskell
kotlin
java
ruby
3. 직접 구현한 Comparator로 Stream.sorted() 사용
이번에는 직접 Comparator를 구현하였습니다. Comparator는 String의 길이를 비교하여 오름차순, 내림차순으로 정렬하도록 구현하였습니다.
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);
Output:
sorted:
java
ruby
kotlin
haskell
smalltalk
reversed:
smalltalk
haskell
kotlin
java
ruby
4. Comparable가 구현된 Custom 클래스로 Stream.sorted() 사용
이번에는 Comparable을 구현한 Custom class를 정의하였고 Stream.sorted()
를 사용하여 요소들을 정렬하였습니다.
방법은 implements Comparable
처럼 인터페이스를 구현하고 compareTo() 메소드를 오버라이드하는 것입니다.
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;
}
}
Output:
java
ruby
kotlin
haskell
smalltalk
Related Posts
- Java - Unsupported class file major version 61 에러
- Java - String.matches()로 문자열 패턴 확인 및 다양한 예제 소개
- Java - 문자열 공백제거 (trim, replace)
- Java - replace()와 replaceAll()의 차이점
- Java - ArrayList 초기화, 4가지 방법
- Java - 배열 정렬(Sorting) (오름차순, 내림차순)
- Java - 문자열(String)을 비교하는 방법 (==, equals, compare)
- Java - StringBuilder 사용 방법, 예제
- Java - 로그 출력, 파일 저장 방법 (Logger 라이브러리)
- Java IllegalArgumentException 의미, 발생 이유
- Java - NullPointerException 원인, 해결 방법
- Seleninum의 ConnectionFailedException: Unable to establish websocket connection 해결
- Java - compareTo(), 객체 크기 비교
- Java - BufferedWriter로 파일 쓰기
- Java - BufferedReader로 파일 읽기
- Java charAt() 함수 알아보기
- Java - BigInteger 범위, 비교, 연산, 형변환
- Java contains()로 문자(대소문자 X) 포함 확인
- Java - Set(HashSet)를 배열로 변환
- Java - 문자열 첫번째 문자, 마지막 문자 확인
- Java - 문자열 한글자씩 자르기
- Java - 문자열 단어 개수 가져오기
- Java - 1초마다 반복 실행
- Java - 배열을 Set(HashSet)로 변환
- Java - 여러 Set(HashSet) 합치기
- Java - 명령행 인자 입력 받기
- Java - 리스트 역순으로 순회, 3가지 방법
- Java - 특정 조건으로 리스트 필터링, 3가지 방법
- Java - HashMap 모든 요소들의 합계, 평균 계산
- Java - 특정 조건으로 HashMap 필터링
- Java - 싱글톤(Singleton) 패턴 구현
- Java - 숫자 왼쪽에 0으로 채우기
- Java - String 배열 초기화 방법
- Java - 정렬된 순서로 Map(HashMap) 순회
- Java - HashMap에서 key, value 가져오기