skip(long n) // n개 건너뜀
limit(long maxSize) // 최대 maxSize개 반환
// 중복 요소 제거
distinct()
// 주어진 조건 p에 맞지 않는 요소 걸러냄
// 리턴타입이 boolean인 람다식으로 사용 가능
filter(Predicate<? super T> p)
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) // 정렬 조건 추가
스트림의 요소에 저장된 값 중에서 원하는 필드만 뽑아내거나 특정 형태로 변환해야 할 때
매개변수로 T 타입을 R 타입으로 변환해서 반환하는 함수를 지정해야 한다.
Stream<R> map(Function<? super T, ? extends R> mapper)
연산과 연산 사이에 올바르게 처리되었는지 확인하고 싶을 때 사용
forEach와 다르게 스트림 요소를 소모하지 않음
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();
스트림의 요소가 배열이거나, 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);