본문 바로가기
Modern java in action

[modern java in action] stream(3)

by 상국이 2021. 6. 24.
728x90

4-3 매핑

→ 특정 객체에서 특정 데이터를 선택하는 작업

    1) 스트림의 각 요소에 함수 적용하기

map : 인수로 제공된 함수는 각 요소에 적용되며 함스를 적용한 결과가 새로운 요소로 매핑된다. → 새로운 버전을 만드는 개념 (변환에 가까운 매핑)

List<String> dishNames = menu.stream()
                             .map(Dish::getName)
                             .collect(toList());

    2) 스트림 평면화

map과 Arrays.stream 활용

String[] arrayOfWords = {"Goodbye", "World"};
Stream<String> streamOfWords = Arrays.stream(arrayOfWords);
 
words.stream()
     .map(word -> word.split(""))                           //각 단어를 개별 문자열 배열로 변환
     .map(Arrays::stream)                                   //각 배열을 별도의 스트림으로 생성
     .distinct()
     .collect(toList());                                    //결과 : List<Stream<String>>

 

    3) flatMap

→ 각 배열을 스트림이 아니라 스트림의 콘텐츠로 매핑한다. (하나의 평면화된 스트림을 반환한다.

words.stream()
     .map(word -> word.split(""))                           //각 단어를 개별 문자열 배열로 변환
     .map(Arrays::stream)                                   //각 배열을 별도의 스트림으로 생성
     .distinct()
     .collect(toList());                                    //결과 : List<String>

 

4-4 검색과 매칭

→ 특정 속성이 데이터 집합에 있는지 여부를 검색하는 데이터 처리

    1) 프레디케이트가 적어도 한 요소와 일치하는지 확인

anyMatch : 주어진 스트림에서 적어도 한 요소와 일치하는지 확인

if(menu.strea().anyMatch(Dish::isVegetarian)){
    System.out.println("The menu is (somewhat) vegetarian friendly!");
}
//boolean을 반환하므로 최종 연산

    2) 프레디케이트가 모든 요소와 일치하는지 검사

allMatch : 스트림의 모든 요소가 주어진 프레디케이트와 일치하는지 검사

boolean isHealthy = menu.stream()
                        .allMatch(dish -> dish.getCalories() < 1000);

    3) NONEMATCH

nonMatch : allMatch와 반대 연산

boolean isHealthy = menu.stream()
                        .noneMatch(dish -> dish.getCalories() >= 1000);

 

 * anyMatch, allMatch, noneMatch 세 메서드는 스트림 쇼트서킷 기법을 사용한다. (앞에서 하나라도 거짓이나오면 나머지 결과와 상관없이 결과도 거짓)

    4) 요소 검색

Optional : Optional<T>클래스는 값의 존재나 부재 여부를 표현하는 컨테이너 클래스다.

Optional<Dish> dish = menu.stream()
                          .filter()
                          .findAny();           //Optional<Dish> 반환
                          .ifPresent(dish -> System.out.println(dish.getName()));

 

 - isPresent() : Optional이 값을 포함하면 참을 반환, 값을 포함하지 않으면 거짓을 반환

 - isPresent(Consumer<T> block) 은 값이 있으면 주어진 블록을 실행한다. Consumer 함수형 인터페이스에는 T형식의 인수를 받으며 void를 반환하는 람다를 전달할 수 있다.

 - T get()은 값이 존재하면 값을 반환하고 없으면 NoSuchElementException을 일으킨다.

 - T orElse(T other)는 값이 있으면 값을 반환하고 없으면 기본값을 반환한다.

    5) 첫 번째 요소 찾기

스트림에서 논리적인 아이템 순서가 정해져있는데 첫 번째 요소를 찾기

List<Integer> someNumbers = Arrays.asList(1,2,3,4,5);
Optional<Integer> firstSquareDivisibleByThree =
        someNumbers.stream()
                   .map(n -> n * n)
                   .filter(n -> n % 3 ==0)
                   .findFirst();                        //9

 

 - findFirst / findAny : 병렬실행의 경우 첫 번째 요소를 찾기 힘들기 때문에 요소의 반환 순서가 상관없다면 병렬 스트림에서는 제약이 적은 findAny를 사용한다.

728x90

댓글