Language | Basic/Java

Stream API

주정용 2021. 5. 10. 18:34
728x90

개념

  • 스트림 데이터는 처리 과정에서 임시로 존재합니다.
  • 스트림은 필요한 작업을 수행한 후 자동으로 소멸합니다.
  • 데이터 소스 원본을 변경하지 않고도 데이터를 처리할 수 있습니다.

구성

  1. 스트림 생성
  2. 중개 연산
    1. 스트림을 받아서 스트림을 반환합니다.
    2. 여러개의 중개 연산을 수행할 수 있습니다.
    3. 중개 연산은 일반적으로 지연 연산입니다.
  3. 최종 연산
    1. 스트림의 결과를 산출합니다.
    2. 이때 지연 연산으로 미뤄진 중개 연산을 수행합니다.
    3. 최종 연산 이후 스트림은 소멸합니다.

특징

  • 스트림은 각 요소의 처리 방법에 관심을 두고 있습니다.
  • 개발자가 반복문을 구현해서 요소에 접근 --> 외부 반복
  • 스트림은 내부적으로 각 요소마다 접근 --> 내부 반복
  1. 파이프-필터 패턴
    1. 스트림은 데이터에 대해서 각종 중개 연산(필터) 후 최종 연산으로 결과를 산출합니다.
  2. 지연 연산
    1. 지연 연산은 어떤 값이 사용되기 전까지 연산을 미뤄두는 것입니다.
    2. 각 필터에서는 중개 연산이 이뤄집니다.
    3. 중개 연산은 미뤄지다가 최종 연산이 시작되면 처리됩니다.
    4. 지연 연산으로 메모리를 절약할 수 있고, 성능에서 이익을 얻을 수 있습니다.
  3. 재사용 불가
    1. 최종 연산이 이뤄지면 스트림은 자동으로 소멸합니다.

종류

  • BaseStream : 모든 스트림 API의 상위 객체
  • Stream<T> : T 타입 데이터 처리 스트림
  • DoubleStream : dobule 타입 데이터 처리 스트림
  • IntStream : int 타입 데이터 처리 스트림
  • LongStream : long 타입 데이터 처리 스트림
  • 생성방법

  • 데이터 소스의 종류에 따라 생성방법이 다릅니다.
  1. 컬렉션(Collection)
    1. Collection 인터페이스에 있는 stream(), parallelStream()
  2. 배열
    1. Arrays의 stream(T[] array)
    2. 기본 데이터 타입의 스트림은 **Stream.of(T[] array)도 가능
  3. 범위
    1. 범위를 사용할 때에는 정수만 가능
    2. IntStream, LongStream
      1. range(int start, int end) : 요소에 end를 포함하지 않고 스트림을 생성
      2. rangeClosed(int start, int end) : 요소에 end를 포함해서 스트림을 생성
  4. 가변길이 인자
    1. 스트림에 포함할 요소를 하나하나 파라미터로 넣어줄 수 있음
    2. 모든 스트림에서 of( ... )로 해당 타입의 스트림 생성

BaseStream 인터페이스

  • 모든 스트림 API에서 구현하는 기본 스트림 객체입니다.
  • 모든 스트림 API가 공통으로 사용하는 메서드가 있습니다.

Stream 인터페이스

  • 객체 타입의 데이터를 처리하기 위한 스트림 API입니다.
  • collect, count, filter, forEach, map, max, min, reduce, sorted, toArray 등의 메서드가 있습니다.

    Optional 클래스

  • 스트림 연산의 결과값을 가지는 컨테이너 객체입니다.
  • 연산 결과 값이 있을 수도 있고, 없을 수도 있습니다.
  • OptionalDouble, OptionalInt, OptionalLong 클래스 등도 있습니다.

기본 타입 스트림

  • DoubleStream, IntStream, LongStream
  • average, count, distinct, max, min, skip(long n), sorted, sum 등의 메서드가 있습니다.
  • 생성방법
    1. Arrays.stream(T[] array)
    2. **Stream.of(T[] array)

병렬 스트림

  • 병렬 처리는 요소를 부분적으로 처리한 후 각 결과를 결합해서 최종 결과를 도출합니다.
  • 병렬 스트림 생성
    1. Collection 객체 parallelStream()
    2. 배열 객체 **Stream.of(T[] array).parallel()

활용

  1. 매핑 : 기존 스트림 요소를 map()의 인자인 람다식으로 변경해서 새로운 스트림을 생성합니다.
  2. 컬렉션 변환 : 스트림을 Collection 객체로 변경합니다. collect()의 인자인 Collector를 이용해서 변경할 컬렉션 타입을 정합니다.
  3. 반복자 : 모든 요소에 접근할 수 있는 Iterator, Spliterator(병렬 처리) 객체를 생성합니다.

'Language | Basic > Java' 카테고리의 다른 글

Java의 Garbage Collection  (0) 2021.05.28
JVM의 Heap Area  (0) 2021.05.28
JVM(Java Virtual Machine)이란  (0) 2021.05.28
Lambda와 함수형 인터페이스  (0) 2021.05.18
java.lang.String의 Static Methods  (0) 2020.05.08