반응형

스트림의 중간연산

  • 스트림 자르기 - skip(), limit()

skip()은 스트림의 요소중에 앞에서부터 n개 건너뛰는 것이다.
limit()은 지정된 값 이후의 요소는 잘라낸다.

.rangeClosed()는 to가 포함이다. 그래서 스트림 요소가 1부터 10이다. 
여기서 skip(3)을 하면, 3개를 건너띄고, .limit(5)로 5개를 자르면, 4, 5, 6, 7, 8 이고 이렇게 5개만 담긴 스트림을 반환한다.

그리고 그 요소를 forEach(System.out::print)로 출력하니까 45789이 나온다.

 

  • 스트림의 요소 걸러내기 - filter(), distinct()

filter()는 조건에 맞지 않는 요소를 제거한다. 파라미터로 조건식을 준다.
distinct()는 중복을 제거한다.

예를 들어서 스트림의 요소가 위와 같을 때, distinct()를 하면 중복된 것이 제거된다.

 

스트림의 요소가 위와 같을 때, filter()에 조건으로 i -> i % 2 == 0 즉, 2의 배수 라고 조건을 주면, 해당 조건을 만족시키는 것만 통과시키는 것이다. 
그러면 2의 배수가 아닌 즉, 홀수는 제거되고 짝수만 스트림으로 반환된다.

필터를 여러번 연속적으로 사용할 수도 있다. filter는 중간연산이기 때문이다.
두 조건을  논리연산자로 연결해도 되고, 두번째 작성한 것 처럼 두번으로 나눠서 써도 된다.

 

  • 스트림 정렬하기 - sorted()

원래 정렬할 때 필요한 것은 2가지가 있다. 
1. 정렬 대상
2. 정렬 기준
이 필요한데,

comparator가 정렬 기준이다. 
그런데 만약에 comparator를 주지 않으면, 스트림 요소의 기본정렬(Comparable)로 정렬한다.

문자열 스트림이 있을 때, 
sorted()를 하면 기본정렬,
sorted(Comparator.naturalOrder())로 하면, 기본 정렬,

sorted(s1, s2) _> s1.compareTo(s2)); 이렇게 하면 s1, s2를 비교한 결과를 주는 것이다.  그리고 이것을 메서드 참조로 바꾸면,

sorted(String::compareTo); 이렇게 쓸 수 있다.  메서드 참조가 이해되지 않으면 메서드 참조를 람다식으로 바꾸는 연습을 하자.

sorted(Comparator.reverseOrder()) 는 기본정렬의 역순으로 정렬한다.
sorted(Comparator.<String>naturalOrder().reversed()) 라고 쓸 수도 있는데, 보통 위에 형태로 쓴다.

sorted(String.CASE_INSENSITIVE_ ORDER) 은 대소문자를 구별하지 않는다.  CASE_INSENSITIVE 라는 것은 Comparaotr 인데, String 클래스가 Comparator를 미리 만들어서 가지고 있는 것이다. 자주 쓰이는 것이라서 만들어져있다. 우리는 가져다가 쓰면 된다. 

sorted(String.CASE_INSENSITIVE_ORDER.reversed())는 대소문자를 구분하지 않고 역순으로 정렬한다.
그런데 sorted(String.CASE_INSENSITIVE_ORDER)의 완전 역순은 아니다.  출력결과를 보면,
sorted(String.CASE_INSENSITIVE_ORDER)의 출력결과는 aaabCCccdd 인데,
sorted(String.CASE_INSENSITIVE_ORDER.reversed())의 출력결과는 ddCCccbaaa 이다.
대문자의 위치가 좀 이상하다. 오타가 아니다. 유의하자.

sorted(Comparator.comparting(String::length)) 는 길이순으로 정렬한다.

sorted(Comparator.comparing(String::length).reversed())는 길이순 정렬을 역순으로 한다.

 

  • Comparator의 comparing()으로 정렬 기준을 제공

comparing() 메서드는 위와 같이 선언되어 있다. 
Function이라는 함수형 인터페이스를 매개변수로 받게 되어있다.
추가적으로 Comparator를 따로 지정해 줄 수도 있다. 

사용방법은 아래와 같다.

반별로 정렬하는 코드다.
StudentStream의 각 Student객체들을 반별로 정렬한다. 
(Student:getBan) 메서드 참조를 람다식으로 바꾸면, (String s) -> s.getBan() 이렇게 작성할 수 있다.

sorted() 메서드는 매개변수로 Comparator가 필요하다. 

 

 

  • 추가 정렬 기준을 제공할 떄는 thenComaring()을 사용

만약,정렬 기준이 여러개일 때는 thenComparing()을 사용하면 된다. 

반별로 정렬하고,
총점별로 정렬하고,
이름별로 정렬하는 등 

정렬 기준이 3개다.

이렇게 여러개 기준으로 정렬할 때는 .thenComapring 으로 계속 이어주면 된다. 

 

 

반응형

'JAVA' 카테고리의 다른 글

Optional<T>  (0) 2022.11.22
스트림의 중간연산(2)  (0) 2022.11.19
스트림의 연산  (0) 2022.11.16
스트림 만들기  (0) 2022.11.15
스트림, 스트림의 특징  (0) 2022.11.14