스트림
스트림이란?
- 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해준다.
- 함수적 스타일로 처리할 수 있다.
스트림의 특징
- Iterator와 비슷하지만 내부 반복자를 사용하므로 병렬처리가 쉽다.
- 중간 처리와 최종 처리 작업을 수행한다.

내부 반복자
- 컬렉션 내부에서 요소룰 반복시키고, 개발자는 요소당 처리해야 할 코드만 제공
- 개발자는 요소 처리 코드에만 집중한다
- 병렬 작업을 할 수 있게 도와주기 때문에 순차적 외부 반복자보단 효율적으로 반복시킬 수 있다.
외부 반복자
- 개발자가 코드로 직접 컬렉션의 요소를 반복해서 가져오는 코드 패턴
- index를 이용한 for문, Iterator를 이용한 while문은 모두 외부 반복자를 이용
병렬처리란 ?
- 한 가지 작업을 서브 작업으로 나누고, 서브 작업들을 분리된 스레드에서 병렬적으로 처리하는 것
- 런타임 시 하나의 작업을 서브 작업으로 자동으로 나누고, 서브 작업의 결과를 자동으로 결합해서 최종 결과물 생성
중간처리&최종처리

- 중간 처리
- 최종 처리
- 스트림은 이런 중간처리와 최종 처리를 파이프라인으로 해결한다
- 파이프라인
- 여러 개의 스트림이 연결되어 있는 구조
- 최종 처리를 제외하고는 모두 중간 처리 스트림
필터링 - distinct(), filter()
필터링은 중간 처리 기능으로 요소를 걸러내는 역할
- distinct()
- 중복을 제거하는데, Stream의 경우 Object.equals(Object)가 true라면 중복을 제거
- filter()
- 매개값으로 주어진 Predicate가 true를 리턴하는 요소만 필터링
매핑 - flatMap(), map(), as~Stream(), boxed()
매핑은 중간 처리 기능으로 스트림의 요소를 다른 요소로 대체하는 작업
- flatMap
- 요소를 대체하는 복수 개의 요소들로 구성된 새로운 스트림을 리턴
- mapXXX
- 요소를 대체하는 요소로 구성된 새로운 스트림을 리턴
- asDoubleStream
- int 요소 혹은 long 요소를 double 요소로 타입 변환해서 DoubleStream을 생성
- asLongStream
- int 요소를 Long 요소로 타입 변환해서 LongStream을 생성
- boxed
- int, long, double 요소를 Integer, Long, Double 요소로 박싱해서 Stream 생성
정렬
중간 처리 기능으로 최종 처리되기전에 요소를 정리한다.
루핑 - peek(), forEach()
- 루핑(looping)
- peek()
- 중간 처리 메소드
- 전체 요소를 루핑하면서 추가적인 작업을 하기 위해 사용
- 반드시 최종 처리 메소드가 호출되어야 동작한다.
- forEach()
- 최종 처리 메소드
- 파이프라인 마지막에 루핑하면서 요소를 하나씩 처리
- sum()과 같은 다른 최종 메소드를 같이 호출하면 안된다.
매칭 - allMatch(), anyMatch(), noneMatch()
- allMatch()
- 모든 요소들이 매개값으로 주어진 Predicate의 조건을 만족하는지 조사
- anyMatch()
- 최소한 한 개의 요소가 매가값으로 주어진 Predicate의 조건을 만족하는지 조사
- noneMatch()
- 모든 요소들이 매개값으로 주어진 Predicate의 조건을 만족하지 않는지 조사
기본 집계 - sum(), count(), average(), max(), min()
- 최종 처리 기능으로 요소들을 처리해서 합계, 평균값 등과 같이 하나의 값으로 산출
- 대량의 데이터를 가공해서 축소하는 리덕션(Reduction)이라고 볼 수 있다.
커스텀 집계 - reduce()
프로그램화해서 다양한 집계 결과물을 만들 수 있도록 제공
수집 - collect()
요소들을 필터링 또는 매핑한 후 요소들을 수집하는 최종 처리 메소드