TAKEWHILE
Java 9에 추가된 메서드
Predicate<T>
를 파라미터로 받아서 해당 Predicate
가 false를 반환할 때까지의 요소를 취하는 메서드다.
얼핏보면 filter
메서드와 유사해보이지만, filter
메서드가 전체 스트림에 대한 Predicate
를 판단하는 반면 takeWhile
은 Predicate
가 false를 반환하는 순간 나머지 요소를 전부 버린다.
무한 스트림을 포함한 모든 스트림에 Predicate
를 적용해 스트림을 슬라이스할 수 있다
DROPWHILE
Predicate<T>
를 파라미터로 받아서 해당 Predicate
가 false를 반환할 때까지의 요소를 모두 버리고 나머지 요소를 반환하는 메서드다.takeWhile
과 정반대로 작업을 수행한다.Predicate
가 false가 되는 지점에서 작업을 중단하고 남은 모든 요소를 반환한다.LIMIT
long
을 파라미터로 받아서 해당 숫자 이하의 요소를 반환limit
의 결과도 정렬되지 않은 상태로 반환된다.SKIP
long
을 파라미터로 받아서 해당 숫자 이하의 요소를 버리고 나머지를 반환skip(n)
을 호출하면 빈 스트림이 반환된다.MAP
Function<T, R>
관련된 함수형 인터페이스)를 적용해서 기존 요소를 새로운 요소로 매핑시키는 map
이라는 메서드를 제공한다.또한 map
은 반환하는 형태에 따라 여러 메서드가 존재한다.
mapToInt
, mapToLong
, mapToDouble
, mapToObj
가 다음에 해당한다.map
메서드가 그 역할을 하는 것이다.IntStream
의 경우 map
, mapToLong
, mapToDouble
, mapToObj
가 존재하며 map
자체가 IntStream
을 반환하고 Stream
의 경우 map
, mapToInt
, mapToLong
, mapToDouble
가 존재하며 map
자체가 Stream
을 반환한다.스트림 평면화(flatMap)
스트림은 파라미터로 제공되는 함수(Function<T, Stream<R>>
과 관련된 함수형 인터페이스)를 적용해서 스트림의 각 값을 다른 스트림으로 만든 다음에 모든 스트림을 하나의 스트림으로 연결하는 기능을 수행하는 flatMap
이라는 메서드를 제공한다.
추상적으로 설명하면 차원을 낮추는 개념이라고 생각된다. (ex. Stream<String[]>
-> Stream<String>
)
map
메서드를 사용할 경우 String[]
배열 자체가 다른 객체로 변환되는데 flatMap
을 사용하면 String[]
내부의 값들 자체를 다른 객체로 변환하는 것이 가능하다.여기서 말하는 함수는 map
의 Function<T, R>
과 약간의 차이가 있다.
flatMap
에서 사용되는 Function
은 T는 동일하지만 R이 Stream<R>
이다.Stream<R>
)이나 기본형 특화 스트림(IntStream
, LongStream
, DoubleStream
)과 같이 스트림 타입이 반환되어야 한다.또한 flatMap
은 반환하는 형태에 따라 여러 메서드가 존재한다.
flatMapToInt
, flatMapToLong
, flatMapToDouble
이 다음에 해당한다.flatMap
만 존재하고 각각의 타입에 맞는 기본형 특화 스트림을 반환한다.NONEMATCH
ANYMATCH
ALLMATCH
쇼트서킷 평가
때로는 전체 스트림을 처리하지 않았더라도 결과를 반환할 수 있다. 예를 들어 여러 and 연산으로 연결된 커다란 boolean 표현식을 평가한다고 가정하자. 표현식에서 하나라도 거짓이라는 결과가 나오면 나머지 표현식의 결과와 상관없이 전체 결과도 거짓이 된다. 이러한 상황을 쇼트 서킷이라고 부른다.
allMatch
,anyMatch
,noneMatch
findFirst
,findAny
등의 연산은 모든 스트림의 요소를 처리하지 않고도 결과를 반환할 수 있따. 원하는 요소를 찾았으면 즉시 결과를 반환할 수 있다. 마찬가지로 스트림의 모든 요소를 가진 스트림을 유한한 크기로 줄일 수 있는 유용한 연산이다.
: 모든 스트림의 요소를 처리해서 값을 도출한다.
요소의 합
int sum = numbers.stream().reduce(0, (a, b) -> a + b);
위의 reduce는 두 개의 인수를 갖는다.
BinaryOperator<T>
초깃값 없음
Optional<Integer> sum = numbers.stream().reduce((a, b) -> (a + b));
BinaryOperator<T>
만 인수로 갖는다.[Stream API] 중간 연산 - slicing 관련 메서드들
[Stream API] 중간 연산 - flatMap 메서드
자바의 정석 3판