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를 사용한다.
'Modern java in action' 카테고리의 다른 글
5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2021.08.22 |
---|---|
[modern java in action] stream(5) (0) | 2021.06.24 |
[modern java in action] stream(4) (0) | 2021.06.24 |
[Modern java in action] Stream(2) (0) | 2021.06.24 |
[modern java in action] Stream(1) (0) | 2021.06.24 |
댓글