스트림의 평면화 - flatMap
map은 주어진 값을 스트림으로 매핑하고, flatMap은 스트림의 내용으로 매핑한다.
다음은 ["Hello", "World"]를 ["H","e""l","o","W","r","d"]로 만드는 예제이다.
//flatMap 사용
List<String> c = words2.stream().map(word -> word.split("")) //Stream<String[]> [H,e,l,l,o], [W,o,r,l,d]
.flatMap(Arrays::stream) //Stream<String> H,e,l,l,o,W,o,r,l,d
.distinct() //H,e,l,o,W,r,d
.collect(Collectors.toList());
//map 사용할 경우, Stream으로 반환하기 때문에 원하는 결과값이 나오지 않는다.
List<String> c = words2.stream().map(word -> word.split("")) //Stream<String[]> [H,e,l,l,o], [W,o,r,l,d]
.map(Arrays::stream) //Stream<Stream<String>>
.distinct()
.collect(Collectors.toList());
map(Arrays::stream)은 String 배열 요소를 그대로 스트림으로 바꾼다. flatMap(Arrays::stream)은 String 배열의 요소를 스트림으로 바꾼 다음, 그것을 감싸고 있는 스트림을 제거해준다.
필터링 - filter
filter는 조건문이 true이면 반환하는 메서드이다. filter는 모든 요소를 돌며 동작하는데, 다음과 같은 슬라이싱 메서드는 모든 요소를 돌지 않고 반환한다.
슬라이싱 - takeWhile
- 정렬 되어있는 경우, 조건이 true면 작업 중단 후 요소 반환(앞으로 슬라이싱)
List<Dish> sliceMenu = specialMenu.stream() .takeWhile(dish -> dish.getCalories < 320) .collect(toList());
슬라이싱 - dropWhile
- 정렬 되어있는 경우 조건이 false면 중단하고 남은 요소 반환(뒤로 슬라이싱)
List<Dish> sliceMenu = specialMenu.stream()
.dropWhile(dish -> dish.getCalories < 320)
.collect(toList());
리듀싱 - reduce
- reduce(초기값, 누적 연산)
- 스트림의 요소를 하나씩 꺼내면서 누적 계산한다.
- 초기값을 작성하지 않으면 Optional로 감싼 객체 반환한다.
Optional<Integer> sum = numbers.stream().reduce((a,b) -> a + b);
//최댓값 찾기
int max = intStream.reduce(Integer.MIN_VALUE, (a,b) -> a > b ? a : b);
// 초기값없으면 Optional
Optional<Integer> max = intStream.reduce(Integer::max);
//최솟값 찾기
int min = intStream.reduce(Integer.MAX_VALUE, (a,b) -> a < b ? a : b);
Optional<Integer> min = intStream.reduce(Integer::min);
int count = intStream.reduce(0, (a,b) -> a + 1);//intStream의 요소 개수 반환
'스터디' 카테고리의 다른 글
[모던 자바 인 액션] 7장. 병렬 데이터 처리와 성능 (0) | 2023.07.21 |
---|---|
[객체지향의 사실과 오해] 6장 객체지도, 7장 함께 모으기 (0) | 2023.07.07 |
[객체지향의 사실과 오해] 5장. 책임과 메시지 (0) | 2023.06.30 |
[모던 자바 인 액션] 4장. Stream (0) | 2023.06.30 |
[모던 자바 인 액션] 3장. 람다, 함수형 인터페이스, 메서드 참조 (0) | 2023.06.28 |
댓글