엔지니어로 가는 길

자바 스트림 API 본문

프로그래밍/Java

자바 스트림 API

탐p슨 2020. 5. 5. 00:35
728x90

출처: https://www.geeksforgeeks.org/stream-in-java/

Java Stream API(Java 8)

자바 8에 등장한 자바 스트림 API는 콜렉션을 처리할 때 사용된다.

스트림은 콜렉션 객체들의 흐름이라고 생각할 수 있다.

물이 나오는 곳에 파이프를 연결하여 원하는 곳으로 이동시킬 수 있듯,

스트림도 메소드(파이프)를 연결(파이프라인화)하여 원하는 결과를 얻을 수 있다.

 

 

https://quppler.com/stream-api-map-and-collect-example/

자바 스트림의 특징

 

-스트림은 자료구조가 아니다. 콜렉션이나 배열 또는 입출력 채널에서 입력을 취한다. (입력만 취한 상태는 물만 받아놓은 상태이므로 이 자체로는 아무것도 아니다. 여기에 파이프를 연결하여 물이 흐르게해야 의미가 생긴다.)

-스트림은 원본 자료구조를 바꾸지 않는다. 오직 파이프라인화된 메소드에 대한 결과만 제공한다.
-각각의 intermediate 연산은 lazily 실행되고(Q) 결과로 스트림을 리턴한다. 따라서 intermediate 연산은 파이프라인화 될 수 있다. Terminal 연산은 스트림의 끝을 표시하고 결과를 리턴한다.

 

Q. 객체가 lazy하게 생성된다는 것은 객체가 쓰이기 직전에 생성한다는 뜻인데, 연산이 lazy하게 실행된다는 것은 무슨 뜻일까. 연산이 되기 직전에 연산한다? 그럼 원래는 컴파일 타임에 연산을 끝마쳐두는데 lazy하게 연산하는거면 한 줄 씩 인터프리터가 해석할 때 연산 라인에 와서야 연산을 수행한다는 걸까?

intermediate 연산

리턴 결과가 스트림이다. 따라서 연산 뒤에 추가적인 파이프를 붙일 수 있다. 3개만 본다.
 
1. map: 특정 함수를 스트림의 원소에 적용한다.

https://www.geeksforgeeks.org/stream-in-java/


2. filter: 특정 조건을 만족하는 원소를 선택한다.

https://www.geeksforgeeks.org/stream-in-java/


3. sorted: 정렬할 때 사용한다.

https://www.geeksforgeeks.org/stream-in-java/

 

Terminal 연산

연산 뒤에 추가적인 파이프를 붙일 수 없다(파이프의 끝에 온다). 3개만 본다.

1. collect: 스트림에서 수행된 intermediate 연산의 결과를 리턴할 때 사용한다.


2. forEach: 스트림의 모든 원소를 순회할 때 사용한다.

https://www.geeksforgeeks.org/stream-in-java/


3. reduce: 스트림의 원소를 하나의 값으로 줄일 때 사용한다.

https://www.geeksforgeeks.org/stream-in-java/

(Identity는 스트림이 비어 있을 경우의 디폴트 값이자 reduction 연산의 초깃값이다.)

 

 


 

이외에도 많은 메소드가 있다. 스트림을 제대로 활용하기 위해선 계속 사용해보며 공부해나가야 할 것 같다.

추가 공부: https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

 

Stream (Java Platform SE 8 )

A sequence of elements supporting sequential and parallel aggregate operations. The following example illustrates an aggregate operation using Stream and IntStream: int sum = widgets.stream() .filter(w -> w.getColor() == RED) .mapToInt(w -> w.getWeight())

docs.oracle.com

연관 주제: lambda, functional interface, method reference ...

 

728x90

'프로그래밍 > Java' 카테고리의 다른 글

JAVA 익명 클래스(Anonymous Classes)  (0) 2020.05.28
JAVA 지역 클래스(Local Classes)  (0) 2020.05.20
JVM 런타임 메모리 영역  (0) 2020.05.02
Java 중첩 클래스  (11) 2020.04.23
Java 접근 제어자와 접근의 의미  (0) 2020.04.21
Comments