본문 바로가기
JAVA

[JAVA 개념11] 스트림(Stream)

by 자유데이터 2018. 11. 13.
반응형

1.스트림
: 데이터가 물처럼 흘러가는 것을 뜻함.
: 중요하고 어렵다.
: 자바에서 대용량 데이터를 핸들링하는 핵심 API.
: 람다식으로 처리할 수 있도록 해주는 반복자(iterator).

-내부 반복자
: 반복자가 stream에 감춰져 있다.
: 병렬처리가 쉽다.
: 람다식으로 요소 처리 코드 제공
    대부분의 요소처리 메소드는 함수적 인터페이스 매개 타입

`

모든 처리가 컬렉션 안으로 들어간다.
반면, 외부 반복자는 개발자 코드에서 처리 해야한다.


ex)내부 반복자와 외부 반복자


ex)람다식으로 표현한 스트림

리스트 타입으로 Student 클래스를 만든다.



-스트림 중간처리
    **중간처리란?
             Data(JCK)
             -가공되지 않은 데이터

                               |

            중간처리(map,sort,fittering...)
            -데이터 가공
              매핑: 객체를 값으로 형변환시키는 것.

                              |

            최종처리(aggregation:집계)
            -Reduction 수행(평균구하기 등... 평균을 구하면 값 하나만 저장하면 된다.)

리덕션: 데이터의 차원을 줄이는 행위(변수, 관측치를 차원이라 한다.)




중간처리가 들어간 스트림의 예제를 보자.

ex)
Student는 위에서 사용한 클래스를 다시 쓴다.

스트림은 병렬처리가 가능하기 때문에 수 많은 데이터를 집계하는데 사용한다.
따라서 데이터분석에서 아주 중요한 역할을 한다.
예제를 통해 순차적 처리와 병렬처리의 차이점을 알아보자.

ex)순차적 vs 병렬

<Console결과>
위의 결과는 순차적 처리이다.
순차적처리는 thread가 하나로 실행되기 때문에 입력한 순서데로 값이 출력이 된다.

밑은 병렬처리 결과이다.
병렬은 여러 thread가 실행되기 때문에 어떤값이 먼저 실행될지 모르며,
실행할때마다 출력 순서가 바뀐다.


2.스트림의 종류
: 자바 8부터 새로 추가
: java.util.stream 패키지에 API 존재


-BaseStream
: 모든 스트림에서 사용 가능한 공통 메소드( 직접 사용하지는 않는다.)

요소의 타입에 따라 나뉜다.
-Stream : 객체 요소 처리

java.util.Collection.stream() 순차처리하겠다.
parrallelStream() 병렬처리하겠다.
IntStream.rangeClosed는 마지막 값 포함한다.

ex)스트림을 통해 디렉토리 출력해보기

<Console결과>
모든 디렉토리를 볼 수 있다.


3.파이프라인
: 여러 개의 스트림이 연결되어 있는 구조
: 파이프라인을 거처 데이터 리덕션이 일어남.
    리덕션(Reduction): 대량의 데이터를 가공해 축소하는 것


-중간 처리 메소드 종류
필터링: 요소를 걸러내는 역할을 한다.                                
매핑: 스트림의 요소를 다른 요소로 대체하는 작업을 한다.
정렬: 요소를 정렬해서 최종 처리 순서를 변경할 수 있다.   
루핑: 요소 전체를 반복한다.                                                

중간처리 메소드는 최종처리 메소드가 실행될때 한 번에 실행된다.
즉, 최종처리가 실행될 때까지 지연(lazy)가 되며 최종처리가 없으면 실행이 되지 않는다.

-최종 처리 메소드 종류

ex)pipeline으로 남자 회원만 평균나이 구하기




4.스트림 메소드 자세히 살펴보기
**필터링
: 요소를  걸러내는 역할을 한다.


예제를 보면 아주 쉽게 이해할 수 있다.
ex)
람다식을 줄이는 방법 또한 신경써보자.



**매핑
: 스트림의 요소를 다른 요소로 대체하는 작업을 한다.








**정렬



**루핑
: 요소 전체를 반복하는것

-peek()
: 중간 처리 메소드
: 최종처리 메소드가 실행되지 않으면 지연

-forEach()
: 최종 처리 메소드
: 파이프라인 마지막에 루핑하며 요소를 하나씩 처리
: 다른 최종 메소드 호출 불가

ex)최종처리 메소드가 없을때 있을때



**매칭






커스텀 집계
요소 값이 없을 경우 reduce에서는 identity가 디폴트값이다.

















반응형

댓글