스트림

강민수·2022년 11월 7일
1

Java

목록 보기
7/9
post-thumbnail

스트림


스트림이란?


  • 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해준다.
  • 함수적 스타일로 처리할 수 있다.

스트림의 특징

  • Iterator와 비슷하지만 내부 반복자를 사용하므로 병렬처리가 쉽다.
  • 중간 처리와 최종 처리 작업을 수행한다.

image

내부 반복자

  • 컬렉션 내부에서 요소룰 반복시키고, 개발자는 요소당 처리해야 할 코드만 제공
  • 개발자는 요소 처리 코드에만 집중한다
  • 병렬 작업을 할 수 있게 도와주기 때문에 순차적 외부 반복자보단 효율적으로 반복시킬 수 있다.

외부 반복자

  • 개발자가 코드로 직접 컬렉션의 요소를 반복해서 가져오는 코드 패턴
  • index를 이용한 for문, Iterator를 이용한 while문은 모두 외부 반복자를 이용

병렬처리란 ?

  • 한 가지 작업을 서브 작업으로 나누고, 서브 작업들을 분리된 스레드에서 병렬적으로 처리하는 것
  • 런타임 시 하나의 작업을 서브 작업으로 자동으로 나누고, 서브 작업의 결과를 자동으로 결합해서 최종 결과물 생성

중간처리&최종처리

image

  • 중간 처리
    • 매핑, 필터링, 정렬을 수행
  • 최종 처리
    • 반복, 카운팅, 평균, 총합 등을 수행
  • 스트림은 이런 중간처리와 최종 처리를 파이프라인으로 해결한다
  • 파이프라인
    • 여러 개의 스트림이 연결되어 있는 구조
    • 최종 처리를 제외하고는 모두 중간 처리 스트림

필터링 - distinct(), filter()

필터링은 중간 처리 기능으로 요소를 걸러내는 역할

  • distinct()
    • 중복을 제거하는데, Stream의 경우 Object.equals(Object)가 true라면 중복을 제거
  • filter()
    • 매개값으로 주어진 Predicate가 true를 리턴하는 요소만 필터링

매핑 - flatMap(), map(), as~Stream(), boxed()

매핑은 중간 처리 기능으로 스트림의 요소를 다른 요소로 대체하는 작업

  • flatMap
    • 요소를 대체하는 복수 개의 요소들로 구성된 새로운 스트림을 리턴
  • mapXXX
    • 요소를 대체하는 요소로 구성된 새로운 스트림을 리턴
  • asDoubleStream
    • int 요소 혹은 long 요소를 double 요소로 타입 변환해서 DoubleStream을 생성
  • asLongStream
    • int 요소를 Long 요소로 타입 변환해서 LongStream을 생성
  • boxed
    • int, long, double 요소를 Integer, Long, Double 요소로 박싱해서 Stream 생성

정렬

중간 처리 기능으로 최종 처리되기전에 요소를 정리한다.


루핑 - peek(), forEach()

  • 루핑(looping)
    • 요소 전체를 반복하는 것
  • peek()
    • 중간 처리 메소드
    • 전체 요소를 루핑하면서 추가적인 작업을 하기 위해 사용
    • 반드시 최종 처리 메소드가 호출되어야 동작한다.
  • forEach()
    • 최종 처리 메소드
    • 파이프라인 마지막에 루핑하면서 요소를 하나씩 처리
    • sum()과 같은 다른 최종 메소드를 같이 호출하면 안된다.

매칭 - allMatch(), anyMatch(), noneMatch()


  • allMatch()
    • 모든 요소들이 매개값으로 주어진 Predicate의 조건을 만족하는지 조사
  • anyMatch()
    • 최소한 한 개의 요소가 매가값으로 주어진 Predicate의 조건을 만족하는지 조사
  • noneMatch()
    • 모든 요소들이 매개값으로 주어진 Predicate의 조건을 만족하지 않는지 조사

기본 집계 - sum(), count(), average(), max(), min()

  • 최종 처리 기능으로 요소들을 처리해서 합계, 평균값 등과 같이 하나의 값으로 산출
  • 대량의 데이터를 가공해서 축소하는 리덕션(Reduction)이라고 볼 수 있다.

커스텀 집계 - reduce()

프로그램화해서 다양한 집계 결과물을 만들 수 있도록 제공


수집 - collect()

요소들을 필터링 또는 매핑한 후 요소들을 수집하는 최종 처리 메소드

profile
능동적으로 개발 지식을 찾아다니는 백엔드 개발자입니다 😊 작성된 글에 대한 질문들 및 피드백은 언제나 환영입니다 :) 👌

0개의 댓글