본문 바로가기
스터디

[모던 자바 인 액션] 스트림 활용 - faltMap, takeWhile, doWhile, reduce

by eunoo 2023. 7. 7.

스트림의 평면화 - 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의 요소 개수 반환

댓글