Stream_3: 중간 연산자

김아무개·2023년 4월 9일
0

Java

목록 보기
5/23

자르기 skip( ) , limit( )

skip(long n)		// n개 건너뜀
limit(long maxSize) // 최대 maxSize개 반환

요소 걸러내기 filter( ) , distinct( )

// 중복 요소 제거
distinct() 	

// 주어진 조건 p에 맞지 않는 요소 걸러냄
// 리턴타입이 boolean인 람다식으로 사용 가능
filter(Predicate<? super T> p) 

정렬 sorted( )

sorted()
sorted(Comparator<? super T> c) // comparator 대신 int 값을 반환하는 람다식을 사용하는것도 가능

+ Comparator 문자열 스트림 정렬 방법 소개

Comparator.naturalOrder() // 기본 정렬
Comparator.reverseOrder() // 기본 정렬의 역순

String.CASE_INSENSITIVE_ORDER // 대소문자 구분 X
String.CASE_INSENSITIVE_ORDER.reversed() // 대소문자 구분X 역순

Comparator.comparing(String::length) // 길이 순 정렬
Comparator.comparingint(String::length) // no 오토박싱 길이 순 정렬
Comparator.comparing(String::length).reversed() // 길이 순 역순 정렬
Comparator.comparing(String::length).thenComparing(Comparator<T> c) // 정렬 조건 추가

변환 map( )

스트림의 요소에 저장된 값 중에서 원하는 필드만 뽑아내거나 특정 형태로 변환해야 할 때
매개변수로 T 타입을 R 타입으로 변환해서 반환하는 함수를 지정해야 한다.

Stream<R> map(Function<? super T, ? extends R> mapper)

조회 peek( )

연산과 연산 사이에 올바르게 처리되었는지 확인하고 싶을 때 사용
forEach와 다르게 스트림 요소를 소모하지 않음


mapToInt( ) , mapToLong( ) , mapToDouble( )

Stream<String> -> IntStream 변환할 때

mapToInt(Integer::parseInt)

Stream<Integer> -> IntStream 변환할 때

mapToInt(Integer::intValue)

count()만 지원하는 Stream<T> 메서드와 달리,
IntStream 같은 기본형 스트림은 아래와 같이 숫자를 다루는데 편리한 최종 연산 메서드들을 제공한다.

int 			sum() 		// 스트림의 모든 요소의 총 합
OptionalDouble 	average() 	// sum() / (double)count()
OptionalInt		max()		// 스트림의 요소 중 제일 큰 값
OptionalInt		min()		// 스트림의 요소 중 제일 작은 값

스트림의 요소가 하나도 없을 때, sum()은 0을 반환하지만,
다른 메서드들은 단순히 0을 반환할 수 없다.
그래서 나머지는 OptionalDouble, OptionalInt 자료형을 반환한다.

중요한 점으로 이 메서드들은 최종 연산이기 때문에 호출 후 스트림을 닫아버린다.

하나의 스트림에서 sum(), average() 등 여러 메서드를 한번에 호출할 수 없다.

여러 메서드를 한번에 호출하려면 summaryStatistics()라는 메서드를 사용한다.

// summaryStatistics() 사용 방법

IntSummaryStatistics stat = scoreStream.summaryStatistics();

long totCnt = stat.getCount();
long totSum = stat.getSum();
double avgScore = stat.getAverage();
int minScore = stat.getMin();
int maxScore = stat.getMax();

flatMap( ) _ Stream<T[ ]>를 Stream<T>로 변환

스트림의 요소가 배열이거나, map()의 연산 결과가 배열인 경우,
즉 스트림의 타입이 Stream<T[ ]>인 경우, Stream<T>로 다루는 것이 더 편리할 때가 있다.
그럴 떄는 map() 대신 flatMap()을 사용하면 된다.

// ex

Stream<String[]> strArrStrm = Stream.of(
	new String[]{"abc", "asd", "sdf"},
	new String[]{"ABC", "ASD", "FDS"}
);

// 위의 스트림을 Stream<String> 타입으로 변환

Stream<String> strStream = strArrStrm.flatMap(Arrays::stream);
profile
Hello velog! 

0개의 댓글