스터디 책 정리/모던 자바 인 액션

스트림 활용

박상순 2023. 9. 11. 22:42

필터링

  • 프리디케이트로 필터링
프리디케이트 필터링 예시 코드
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