<aside> 😊 stream의 개념과 특징에 대해 정리한 페이지입니다 :)

</aside>

stream

- 컬렉션의 저장요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자
- 데이터를 추상화하고, 처리하는데 자주 사용되는 함수들을 정의
	-> 데이터를 추상화하였다는 것은 데이터의 종류에 상관 없이 같은 방식으로 데이터를
		 처리 할 수 있다는 것을 의미하며, 그에 따라 재사용성을 높일 수 있음

stream 특징

🐊 람다식으로 요소 처리 코드를 제공
	- 코드가 간결해지는 장점이 있음

🐢 내부 반복자를 사용하므로 병렬 처리가 쉬움
	- 내부 반복자 : 컬렉션 내부에서 요소들을 반복시키고, 개발자는 요소당 처리해야 할 코드만
	제공하는 코드 패턴
	- 반복문 forEach라는 함수 내부에 숨겨져 있음

🐍 중간 처리와 최종 처리가 존재
	- 중간처리 : 매핑, 필터링, 정렬을 수행함
	- 최종처리 : 반복, 카운팅, 평균, 총합 등의 집계 처리를 수행함

🐉 stream은 일회용
	- 한번 사용이 끝나면 재사용이 불가능
	- Stream이 또 필요한 경우에는 Stream을 생성해 주어야 함
	- 닫힌 Stream을 다시 사용하게 되면 IllegalStateException이 발생

🦕 원본의 데이터를 변경하지 않음
	- Stream API는 원본의 데이터를 조회하여 원본의 데이터가 아닌 별도의 요소들로
		Stream을 생성
	- 그렇기 때문에 데이터로부터 읽기만 함
	- 정렬이나 필터링 등의 작업은 별도의 Stream 요소들에서 처리

<aside> ❗ stream을 이해하기 쉽게 예를 하나 들어보겠습니다

</aside>

학생 객체를 요소로 가지는 컬렉션이 있다고 가정하면, 중간처리에서 학생의 수학 점수를
뽑아 내고 최종 처리에서는 수학 점수의 평균값을 산출하는 행위를 할 수 있음