Java8의 새로운 기능인 java.util.stream 패키지는 함수형 연산 작업(Collections의 map, reduce, filter, .etc)을 지원하는 패키지이다.
Javascript와 python에서 많이 쓰는 것들이 Java에도 있다!
Stream과 Collections의 여러 가지 차이점
Stream은 자료를 저장할 수 있는 data structure가 아니다.
대신, 자료구조, 배열, I/O 채널 등으로부터 받아온 데이터를 연산 파이프라인을 통해 우리에게, 사용자에게 전달해준다.
Stream의 연산의 결과는 결과 그 자체이고, 자료/데이터의 원천/원본(Source)을 변형하지 않는다.
Laziness-seeking.
프로그래밍 관점에서 Laziness란, 미리 준비되어 있는 것이 아니라 필요할 때 준비되는 것 정도라고 이해하면 될 것 같다. 여기와 여기에서 Laziness에 대해 아주 잘 기술하고 있는데, Laziness(‘process-only, on-demand’)는 요즘과 같이 Big data, 병렬 처리(parallel processing), 실시간 처리가 중요한 시대에 더 중요하다. 위 포스트에서는 우리가 온라인 쇼핑몰에서 쇼핑을 할 때 검색 결과 하단에 ‘See more products’라는 것을 예로 들며 Laziness를 설명한다. 하여튼, 요점은 요즘 더 중요해진 Laziness를 Stream API가 support한다는 것이다. Stream operations은 intermediate (Stream-producing) operations와 terminal (value- or side-effect-producing) operations로 나뉘는데 intermediate operations는 항상 lazy하며, 그들의 내부 처리 모델은 많은 양의 데이터를 처리하는 것 & 높은 성능을 보장하도록 최적화 되어있다.
Possibly unbounded. 제한이 없을 수도 있다. limit(n) 또는 findFirst()의 경우, 무한한 데이터라도 유한한 시간안에 연산을 끝마칠 수 있기 때문이다.
Consumable. 즉 일회성이라는 것이다. Iterator처럼, Stream은 필요할 때마다 재생성되어야 한다.
Stream operations
intermediate (Stream-producing) operations
filter()
map()
sorted()
distinct()
limit()
.etc
terminal (value- or side-effect-producing) operations