스트림의 중간연산(1)
스트림의 중간연산
- 스트림 자르기 - 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 |
댓글
이 글 공유하기
다른 글
-
Optional<T>
Optional<T>
2022.11.22 -
스트림의 중간연산(2)
스트림의 중간연산(2)
2022.11.19 -
스트림의 연산
스트림의 연산
2022.11.16 -
스트림 만들기
스트림 만들기
2022.11.15