스트림의 중간연산
스트림 자르기 - skip(), limit()
skip()메서드와 limit()메서드는 스트림을 자르는데 사용한다.
Stream<T> skip(long n) : 스트림의 요소 처음부터 n개만큼 삭제한다.
Stream<T> limit(long maxSize) : 스트림의 요소중 maxSize만 남기고 제거한다.
스트림의 요소 걸러내기 - filter(), distinct()
Stream<T> filter(Predicate<? super T> predicate) : 주어진 조건(Predicate)에 해당하지않는 요소들을 제거한다.
Stream<T> distinct() : 중복되는 요소들을 제거하여 하나만 남긴다.
정렬 - sorted()
스트림을 정렬할 때 사용하는 sorted()메서드 이다.
Stream<T> sorted()
Stream<T> sorted(Comparator<? super T> comparator)
sorted()메서드는 매개변수로 주어지는 Comparator로 스트림을 정렬한다. Comparator를 지정하지않으면 스트림 요소의 기본 정렬 기준으로 정렬된다.
주어진 Student스트림을 정렬하는 예제이다. Ban을 기준으로 정렬하고 naturalOrder()를 통해 클래스에 정의된 compareTo 기준(totalScore)으로 정렬한다. 이후 각각 값들을 하나씩 출력한다.
변환 - map()
map() : 스트림에 저장된 값중 원하는 필드만 뽑아내거나 특정 형태로 변환해야 할 때 사용하는 메소드이다.
Stream<R> map(Function<? super T, ? extends R> mapper)
map()은 중간연산이기 때문에 filenameStream을 보면 최종연산으로 forEach를 사용한다.
fileStream을 보면 map(File::getName)을 통해 Stream<String>으로 변경하고, filter를 통해 확장자가 있는지 확인한다.
이후 확장자만 잘라내기위해 .이후의 값들을 확인. ->모든 확장자 글자들을 대문자로 변경 -> 중복제거 -> 출력 순으로 진행한다.
조회 - peek()
중간연산으로 연산중 결과를 확인할 수 있는 메서드이다.
연산사이에 삽입하여 연산의 결과가 올바르게 나왔는지 확인 가능하다.
중간연산 사이에 filename과 extension을 출력하여 결과를 확인한다.
Stream의 연산의경우 최종연산이 호출되면 중간연산들을 수행하기때문에 하나씩 출력된다.
mapToInt(), mapToLong(), mapToDouble()
map()은 연산의 결과로 Stream<T> 타입의 스트림을 반환하는데, 스트림의 요소를 숫자로 변환하는 경우 IntStream과 같은 기본형 스트림으로 변환하는것이 더 유용하다.
기본형 스트림으로 변환하기 위한 메서드들이다.
IntStream mapToInt(ToIntFunction<? super T> mapper);
DoubleStream mapToDouble(ToDoubleFunction <? super T> mapper);
LongStream mapToLong(ToLongFunction<? super T> mapper)
IntStream과 같은 기본형 스트림의 메서드
int sum() : 스트림의 모든요소의 합
OptionalDouble average() : sum() / (double)count()
OptionalInt max() : 스트림 요소중 최대값
OptionalInt min() : 스트림 요소중 최소값
sum()이나 average()같은 메소드들은 최종연산이기 때문에 한번 호출할경우 스트림이 닫힌다.
연속적으로 해당 메서드들을 호출해야할 경우 summaryStatistics()메서드를 통해서 IntSummaryStatistics형 자료를 따로 생성해주는것이 좋다.
IntStream을 통해 SummaryStatistics()를 호출할 경우 위처럼 getSum(), getAverage()등을 연속적으로 호출이 가능하다.
flatMap() - Stream<T[]>를 Stream<T>로 변환
스트림의 요소가 배열이거나 map()의 연산결과가 배열인 경우 스트림의 타입이 Stream<T[ ]>으로 생성된다.
이러한 경우 Stream<T>로 다루는것이 더 편한데, 이러한 경우 map()이 아닌 flatMap()을 사용해주면 된다.
flatMap을 통해 하나의 스트림으로 정리된것을 알 수 있다.
'Programming > JAVA' 카테고리의 다른 글
스트림의 최종연산 (0) | 2021.09.01 |
---|---|
Optional (0) | 2021.08.25 |
스트림(Stream) (0) | 2021.08.24 |
다양한 함수형 인터페이스 & 메서드 참조 (0) | 2021.08.22 |
람다식(Lambda expression) (0) | 2021.08.21 |