[Modern Java In Action] 4. 스트림
in Programming on Java
우리는 자바를 사용할때 컬렉션(Collection)으로 데이터를 그룹하하고 처리할 수 있다.
- 컬렉션으로 질의문(query)을 통해 원하는 데이터를 걸러낼수없을까?
- 엄청 커다란 컬렉션을 효율적으로 처리하려면 어떻게할수있을까? 자바에서는 이와 같은 고민에서 출발하여 나온것이 스트림(Stream)이다. 스트림에 대해 알아보자.
4.1 스트림이란 무엇인가?
간단히 말해서 컬렉션 데이터를 처리할 수 있는 기능임.
- 선언형으로 코드 구현 가능. (if, loop 사용안하고 ‘빨간색 사과를 필터해줘’ 같은 선언으로 동작수행)
- filter, sorted, map 등 여러 연산을 연결해 데이터 처리 파이프라인을 만들수있음
- 병렬화 가능 (성능조아짐)
4.2 스트림 시작하기
스트림이란? 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소
- 연속된요소 : 연속된 값 집합의 인터페이스.
- 소스 : 컬렉션, 배열등의 데이터 소스로부터 데이터를 받아옴
- 데이터 처리 연산 : filter, map, sort 등.. 지원
스트림의 중요 특성
- 파이프라이닝 : 스트림 연산끼리 연결해 파이프라인구성가능
- 내부반복
4.3 스트림과 컬렉션
컬렉션 : 현재 자료구조가 포함하는 모든 값을 메모리에 저장(ex.DVD에 저장된 영화)
스트림 : 요청할 때만 요소를 계산하는 자료구조 (ex. 인터넷 스트리밍 영화)
1) 딱 한번만 탐색 가능
스트림은 딱 한번만 탐색 가능. 다시탐색하려면 새로운 스트림 생성해야함
2) 외부반복과 내부반복
- 외부반복 : 사용자가 직접 요소를 반복. (ex. 컬렉션에서 for-each문 사용해서 반복)
- 내부반복 : 함수에 어떤 작업을 수행할지만 지정하면 알아서 처리 (ex. 스트림에서 sort 시키면 반복문 안써도 알아서 정렬)
내부반복을 사용하면 작업을 투명하게 병렬처리하고 최적화된 순서로 처리 가능하다.
외부반복을 사용하면 병렬성을 스스로 관리해야한다.
4.4 스트림 연산
1) 중간연산
연산 후 결과로 다른 스트림을 반환하는 연산. 이러한 중간연산들은 연결해서 질의를 만들 수 있다.
ex) filter, map, limit, sorted, distinct …
2) 최종연산
스트림 파이프라인의 결과를 도출.
ex) forEach, count, collect …
https://berrrrr.github.io/programming/2020/07/20/java-stream-api/