티스토리 뷰
자바8에 도입된 새로운 기능 중 스트림(Stream)이 있습니다. 스트림을 이용하면 선언형으로 기존의 컬렉션 데이터들을 처리할 수 있게 됩니다. 쉽게 생각하면 컬렉션 반복을 좀 더 효율적이고 간편하게 수행할 수 있는 방법이라고 볼 수 있습니다. 또한 데이터의 병렬 처리에도 용이한 장점이 있습니다.
위 그림은 Stream을 이해하기 쉽게 표현한 그림입니다. 그림에서 물고기들은 어부들이 설치한 그물에 걸러지고 일정한 규격으로 포장된 뒤 소비자에게 전달됩니다.
자바에서 스트림은 위 그림의 흐름이라고 할 수 있습니다. 이런 흐름속을 헤엄쳐 다니는 물고기와 해양 생물들은 컬렉션 데이터라고 할 수 있겠죠. 데이터들은 스트림을 유영하다가 어부가 설치한 그물에 걸러지게 됩니다. 코드에서는 filter로 표현 되는 부분입니다. filter에 걸러진 데이터들은 이제 일정한 규격으로 포장이 되게 되는데 코드에서는 map으로 표현 됩니다. 그리고 마지막으로 소비자에게 배달 되는 것이 collect라고 할 수 있습니다.
강물의 물결이 한 번 흐르고 나면 다시 되돌아 올 수 없듯이 스트림 역시 한 번 만 소비할 수 있습니다.
스트림을 활용하게 되면 선언적으로 코드를 구현할 수 있기 때문에 일정부분 코드의 가독성이 올라갑니다. 또 filter, map, sorted, collect 등과 같은 다양한 빌딩 블록 연산을 통해 다양한 파이프라인을 구성할 수 있습니다. 그리고 이런 연산 블록들은 모두 병렬연산에 자유롭기 때문에 병렬화를 통해 성능을 향상시킬 수 있습니다.
컬렉션 vs 스트림
데이터를 언제 계산하는가?
- 컬렉션
- 현재 자료구조가 포함하는 모든 값을 메모리에 저장.
즉, 컬렉션의 모든 요소는 컬렉션에 추가하기 전에 계산되야 한다. - 생산자 중심(Supplier-Driven). 즉, 팔기도 전에 창고를 가득 채우며 적극적으로 생산 한다.
- 스트림
- 요청할 때만 요소를 계산하는 고정된 자료구조.
따라서 스트림에 요소를 추가/삭제가 불가하다. - 사용자가 요청하는 값만 스트림에서 추출.
생산자(Producer)와 소비자(Consumer) 관계. - 게으르게 만들어지는 컬렉션과 같다.
즉, 사용자가 데이터를 요청할 때만 값을 계산한다. (요청 중심 제조(Demand-Driven Manufacturing) or 즉석 제조(Just-In-Time Manufacturing))
데이터 소스를 반복 사용할 수 있는가?
- 컬렉션
- 데이터를 반복해서 사용 할 수 있다.
- 스트림
- 데이터를 단 한번만 소비할 수 있다.
외부반복과 내부반복
- 컬렉션 : 외부반복 (External Iteration)
- 스트림 : 내부반복 (Internal Iteration)
'language > JAVA' 카테고리의 다른 글
JAVA 인터페이스(Interface) 다중상속 시 메서드 충돌 해결하기 (1) | 2021.01.22 |
---|---|
Optional<T> (0) | 2020.05.07 |
람다 표현식(Lambda Expressions) (0) | 2020.05.03 |
레거시 코드를 테스트 하는 코드를 만들기 (0) | 2020.04.02 |
데코레이터 패턴(Decorator Pattern) (0) | 2020.02.24 |
- Total
- Today
- Yesterday
- 자바스크립트 개론
- java
- 몰라서망신
- 전략패턴
- Warning
- 크롬
- CONVENTIONS
- 클린코드
- Markov
- 경고
- 자바스크립트개론
- markov chain
- REST API
- was
- 야근
- GROUP BY
- Spring in Action
- 마르코프 연쇄
- 유지보수
- 문장 생성기
- 로그
- restful api
- 마르코프
- RESTful
- 코딩의 기술
- 디자인패턴
- 동적계획법
- html
- DP
- Count
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |