728x90
개념
- 스트림 데이터는 처리 과정에서 임시로 존재합니다.
- 스트림은 필요한 작업을 수행한 후 자동으로 소멸합니다.
- 데이터 소스 원본을 변경하지 않고도 데이터를 처리할 수 있습니다.
구성
- 스트림 생성
- 중개 연산
- 스트림을 받아서 스트림을 반환합니다.
- 여러개의 중개 연산을 수행할 수 있습니다.
- 중개 연산은 일반적으로 지연 연산입니다.
- 최종 연산
- 스트림의 결과를 산출합니다.
- 이때 지연 연산으로 미뤄진 중개 연산을 수행합니다.
- 최종 연산 이후 스트림은 소멸합니다.
특징
- 스트림은 각 요소의 처리 방법에 관심을 두고 있습니다.
- 개발자가 반복문을 구현해서 요소에 접근 --> 외부 반복
- 스트림은 내부적으로 각 요소마다 접근 --> 내부 반복
- 파이프-필터 패턴
- 스트림은 데이터에 대해서 각종 중개 연산(필터) 후 최종 연산으로 결과를 산출합니다.
- 지연 연산
- 지연 연산은 어떤 값이 사용되기 전까지 연산을 미뤄두는 것입니다.
- 각 필터에서는 중개 연산이 이뤄집니다.
- 중개 연산은 미뤄지다가 최종 연산이 시작되면 처리됩니다.
- 지연 연산으로 메모리를 절약할 수 있고, 성능에서 이익을 얻을 수 있습니다.
- 재사용 불가
- 최종 연산이 이뤄지면 스트림은 자동으로 소멸합니다.
종류
BaseStream
: 모든 스트림 API의 상위 객체Stream<T>
: T 타입 데이터 처리 스트림DoubleStream
: dobule 타입 데이터 처리 스트림IntStream
: int 타입 데이터 처리 스트림LongStream
: long 타입 데이터 처리 스트림생성방법
- 데이터 소스의 종류에 따라 생성방법이 다릅니다.
컬렉션(Collection)
- Collection 인터페이스에 있는
stream()
,parallelStream()
- Collection 인터페이스에 있는
- 배열
- Arrays의
stream(T[] array)
- 기본 데이터 타입의 스트림은
**Stream.of(T[] array)
도 가능
- Arrays의
- 범위
- 범위를 사용할 때에는 정수만 가능
IntStream
,LongStream
range(int start, int end)
: 요소에 end를 포함하지 않고 스트림을 생성rangeClosed(int start, int end)
: 요소에 end를 포함해서 스트림을 생성
- 가변길이 인자
- 스트림에 포함할 요소를 하나하나 파라미터로 넣어줄 수 있음
- 모든 스트림에서
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
등의 메서드가 있습니다.- 생성방법
Arrays.stream(T[] array)
**Stream.of(T[] array)
병렬 스트림
- 병렬 처리는 요소를 부분적으로 처리한 후 각 결과를 결합해서 최종 결과를 도출합니다.
- 병렬 스트림 생성
- Collection 객체
parallelStream()
- 배열 객체
**Stream.of(T[] array).parallel()
- Collection 객체
활용
- 매핑 : 기존 스트림 요소를 map()의 인자인 람다식으로 변경해서 새로운 스트림을 생성합니다.
- 컬렉션 변환 : 스트림을 Collection 객체로 변경합니다. collect()의 인자인 Collector를 이용해서 변경할 컬렉션 타입을 정합니다.
- 반복자 : 모든 요소에 접근할 수 있는
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 |