필터링
- 프리디케이트로 필터링
프리디케이트 필터링 예시 코드
List<Dish> vegetarianMenu = menu.stream()
.filter(Dish::IsVegeTarian)
.collect(toList());
- 고유요소 필터링
- 중복을 제거 할 수 있도록 distinct() 도 지원
고유필터 예시 코드
List<Integer> numbers = Arrays.asList(1,2,1,3,3,2,4);
numbers.stream()
.filter(i -> i % 2 == 0)
.distinct()
슬라이싱
- 프리디케이트 슬라이싱
- 컬랙션 리스트가 정렬이 되어 있어야한다.
- takeWhile : 조건이 거짓이 될때 까지 수행하며 참인 값을 리턴
- dropWhile : 조건이 거짓이 될때 까지 수행하며 참인 값을 버리고 나머지를 리턴
- 스트림 축소
- limit
limit 사용 예시 : 필터된 값중 3개만 리스트로 리턴
List<Dish> dishes = specialMenu.stream()
.filter(dish -> dish.getCalories() > 300)
.limit(3)
.collect(toList());
- 요소 건너뛰기
- skip : 전달한 파라메터의 값 만큼 넘기고 결과 값을 리턴함
매핑
- 스트림의 각 요소에 함수 적용하기
- map - 함수를 인수로 받아 새로운 요소로 매핑된 스트림을 반환한다. 기본형 요소에 대한 mapToType 메서드도 지원한다 (mapToInt, mapToLong, mapToDouble)
- 사용자가 필요한 내용으로 새로운 컬랙션으로 변환 시키는 것
- 스트림 평면화
- flatMap - 제공된 함수를 각 요소에 적용하여 새로운 하나의 스트림으로 매핑한다. 결과적으로 하나의 평면화된 스트림을 반환한다.
- ex ) 두개의 단어를 하나의 알파벳 list로 새롭게 만들때 평면화 하여 만들 수 있다
검색과 매칭
- anyMatch : 하나라도 일치하는 요소가 있는지 검사하는 최종연산
- allMatch : 모든 요소가 일치하는지 검사하는 최종연산
- noneMatch : 모든 요소가 일치하지 않는지 확인하는 최종 연산 (allMatch 와 반대의 기능)
- findAny : 일치하는 요소를 찾으면 리턴
- findFirst : 첫 값을 리턴
- Optional<> 클래스 : null point erorr를 피할 수 있음
리듀싱
- 리듀싱 연산 : 모든 스트림 요소를 처리하여 값으로 도출 하는 방식
- 스트림이 하나의 값으로 줄어 들때 까지 계속 반복하여 계산하는 방식
- 요소의 합 예제
int sum = numbers.stream().reduce(0, (a,b) -> a+b);
int product = numbers.stream().reduce(1, (a,b) -> a*b);
- 초기 값 없음 -> optional 객체를 리턴하도록 오버로드 되어있음
Optional<Integer> sum = numbers.stream().reduce((a,b) -> (a+b));
- 최댓값과 최솟값 계산
Optional<Integer> max = numbers.stream().reduce(Integer::max);
Optional<Integer> min = numbers.stream().reduce(Integer::min);
- 장점과 병렬화 : 내부 반복 추상화로 reduce를 병렬로 실행할 수 있게 된다. 하지만 반복적 합계의 경우 입력 인스턴스의 값이 변경되면 안되기 때문에 병렬화가 어렵다. 이를 포크/조인 프레임워크로 스트림은 처리할 수 있도록 하였다.
- 스트림의 상태 없음과 있음
- 상태가 없는 연산 : 연산을 위해 이전 내역들을 저장할 필요가 없는 filter, map 등
- 상태가 있는 연산 : 연산 결과를 위해 이전 내역들을 모두 버퍼에 저장할 필요가 있는 sorted, distinct 등
숫자형 스트림
- 기본형 특화 스트림
- IntStream, DoubleStream, LongStream
- 각각의 스트림은 sum,max 등 리듀스 연산 메서드 제공
- 숫자스트림 매핑
- mapToInt, mapToDouble, mapToLong
- 각각을 intStream, DoubleStream, LongStream으로 특화 스트림으로 변환 시켜서 사용할 수 있게함
int calories = menu.stream()
.mapToInt(Dish::getCalories) <- intStream으로 변환
.sum();
- 객체 스트림으로 복원하기
- boxed()를 사용하여 특화 스트림을 일반 스트림으로 변환 시킬 수 있음
IntStream intStream = menu.stream().mapToInt(Dish::getCalories);
Stream<Integer> stream = intStream.boxed();
- 숫자 범위
- range(n, m) : n과 m 이 미포함
- rangeClosed (n, m) : n과 m 이 포함
스트림 만들기
- 값으로 스트림 만들기
- Stream.of (a,b,c,d) : a,b,c,d를 가지는 stream을 만든다
- Stream.empty() : 스트림 비우기
- null이 될 수 있는 객체로 스트림 만들기
- Stream.ofNullable을 사용 null 값이 될 수 있는 객체의 스트림 생성
- 배열로 스트림 만들기
- Arrays.stream([]) : 해당 배열 자료형의 stream 생성
- 파일로 스트림 만들기
- Files.lines 으로 파일의 각 행 요소를 반환하는 stream 생성 가능
- Files.lines으로 파일의 내용을 읽고 flatMap과 Array.stream을 사용하여 Stream<String>을 얻어 낼 수 있음
- 함수로 무한 스트림 만들기
- 무한하게 스트림을 만들면 안되기 때문에 limit(N)으로 제한을 두어 사용한다.
- Stream.iterate : 연속된 일련의 값을 만들때 사용
- Stream.generate : suppelier<T>를 사용하여서 연산
728x90
'스터디 책 정리 > 모던 자바 인 액션' 카테고리의 다른 글
병렬 데이터 처리와 성능 (0) | 2023.09.12 |
---|---|
스트림으로 데이터 수집 (0) | 2023.09.12 |
스트림 (0) | 2023.09.11 |