Stream의 특징
기능적인 측면에서 스트림은 컬렉션(배열 포함)의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자이다.
import java.util.*; | |
public class Main { | |
public static void main(String[] args) { | |
List<Integer> list = Arrays.asList(1, 2, 3); | |
Iterator<Integer> it = list.iterator(); | |
while (it.hasNext()) { | |
int num = it.next(); | |
System.out.println(num); | |
} | |
} | |
} |
정수가 있는 리스트를 하나씩 순회하면서 값을 출력하는 단순한 코드이다.
이를 스트림으로 바꿔 보자.
import java.util.*; | |
import java.util.stream.*; | |
public class Main { | |
public static void main(String[] args) { | |
List<Integer> list = Arrays.asList(1, 2, 3); | |
Stream<Integer> stream = list.stream(); | |
stream.forEach(System.out::println); | |
} | |
} |
코드가 매우 간결해진 것을 확인할 수 있다.
스트림의 특징
(1) 람다식으로 요소 처리 코드를 제공한다.
위의 코드에서 볼 수 있듯이, 스트림은 람다식 또는 메소드 참조를 이용한다.
따라서, 코드가 간결해지는 장점이 있다.
(2) 내부 반복자를 사용하므로 병렬 처리가 쉽다.
외부 반복자란 개발자가 코드로 직접 컬렉션의 요소를 반복해서 가져오는 코드 패턴을 말한다. 우리가 흔히 사용하는 index를 이용한 반복문이나 Iterator를 사용한 while문은 모두 외부 반복자를 이용하는 것이다. 반면, 내부 반복자는 컬렉션 내부에서 요소들을 반복시키고, 개발자는 요소당 처리해야 할 코드만 제공하는 코드 패턴을 말한다,
위의 그림은 외부 반복자와 내부 반복자를 나타낸 것이다. 내부 반복자는 요소들의 변경 순서를 변경하거나, 멀티 코어 CPU를 최대한 활용하기 위해서 요소들을 분배시켜 병렬 작업을 할 수 있도록 도와 준다.
스트림은 람다식으로 요소 처리 내용만 전달할 뿐, 반복은 컬렉션 내부에서 일어난다. 따라서, 요소의 병렬 처리가 컬렉션 내부에서 처리되므로 효율적인 병렬 처리가 가능하다.
(3) 중간 처리와 최종 처리가 존재한다.
스트림은 컬렉션의 요소에 대해 중간 처리와 최종 처리를 수행할 수 있는데, 중간 처리에서는 매핑, 필터링, 정렬을 수행하고 최종 처리에서는 반복, 카운팅, 평균, 총합 등의 집계 처리를 수행한다.
만약, 학생 객체를 요소로 가지는 컬렉션이 있다고 가정하면, 중간 처리에서 학생의 수학 점수를 뽑아 내고 최종 처리에서는 수학 점수의 평균값을 산출하는 행위를 할 수 있음!
'공부 STUDY > JAVA' 카테고리의 다른 글
[JAVA] 자바의 예외처리(Exception) | try-catch-finally 문, try-with-resource 문 (0) | 2023.01.23 |
---|---|
[JAVA] 람다식이란? 람다식 사용 방법에대해 알아보자! (1) | 2023.01.23 |
[JAVA] 내부 클래스(inner class)와 익명 클래스(anonymous class)에대해 알아보자 (1) | 2023.01.21 |
[자바/ 자료구조] 컬렉션 프레임워크 공부 전, 자료구조를 간단히 정리해보자! (0) | 2023.01.21 |
[JAVA] Optional이란? | Optional 개념 및 사용법 (0) | 2023.01.17 |