Java 공부

[Java 공부] 스트림

동성만능크리너 2024. 8. 1. 23:10

지금까지 컬렉션 및 배열에 저장된 요소를 반복 처리하기 위해서는 for 문을 이용했다. Java 8부터는 또 다른 방법으로 컬렉션 및 배열의 요소를 반복 처리하기 위해 Stream 반복자를 사용할 수 있다. Stream은 요소들이 하나씩 흘러가면서 처리된다는 의미를 가지고 있다. 

 

리스트를 출력하는 코드를 for문과 stream으로 비교하기

좌 : for문 우 : stream

 

List 컬렉션의 stream() 메소드로 Stream객체를 얻고, forEach() 메소드로 요소를 어떻게 처리할지 람다식으로 제공한다. 

 

Stream은 Iterator와 비슷한 반복자이지만, 다음과 같은 차이점을 가지고 있다.

1) 내부 반복자이므로, 처리 속도가 빠르고, 병렬 처리에 효율적이다. 
2) 람다식으로 다양한 요소 처리를 정의할 수 있다. 
3) 중간 처리와 최종 처리를 수행하도록 파이프라인을 형성할 수 있다. 

 

내부 반복자

for 문과 Iterator는 컬렉션의 요소를 컬렉션 바깥쪽으로 반복해서 가져와 처리하는데, 이것을 외부 반복자라고 한다. 반면 스트림은 요소 처리 방법을 컬렉션 내부로 주입시켜서 요소를 반복 처리하는데, 이것을 내부 반복자라고 한다.

 

 

이처럼 내부 반복자는 반복의 구체적인 동작을 컬렉션 내부에서 처리하기 때문에, 개발자는 반복의 세부 사항을 신경 쓸 필요 없이, 어떤 작업을 수행할지에만 집중할 수 있게 해준다. 

 

중간 처리와 최종 처리 

스트림은 하나 이상 연결될 수 있다. 컬렉션의 오리지날 스트림 뒤에 필터링 중간 스트림이 연결될 수 있고, 그 뒤에 매핑 중간 스트림이 연결될 수 있다. 그리고 마지막에 스트림의 요소를 최종적으로 처리하여 결과를 생성하는 연산을 최종 처리라고 한다.

 

 

오리지날 스트림과 최종 처리 사이의 중간 스트림들은 최종 처리를 위해 필터링같이 요소를 걸러내거나, 매핑같이 요소를 변화시키거나, 소팅같이 정렬하는 작업을 수행한다. 최종 처리는 중간처리에서 정제된 요소들을 반복하거나, 집계하는 작업을 수행한다.

 

 

스트림의 사용 예시. 학생 객체들을 모아둔 리스트에서 '어떤 상태'인 학생 객체들만 뽑아서 새로 리스트를 만들어주는 로직을 단 3줄로 가독성 좋게 만들 수 있다.