[아래 문서를 참고해서 번역했습니다. 오류나 잘못된 내용이 있으면 피드백 부탁드립니다.]
Stream (Java Platform SE 8 ) (oracle.com)
- 스트림은 일련의 요소로서, 순차적이고 병렬적인 집계 연산을 제공합니다.
아래 예시는 Stream과 IntStream 을 활용한 집계 연산을 보여줍니다.
int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
.mapToInt(w -> w.getWeight())
.sum();
- 이 예시에서 widgets는 Collection<Widget>입니다. 우리는 Collection.stream()을 활용해서 Widget 객체들의 스트림을 만들고, 오직 빨간 widgets만 포함하는 스트림을 만들기 위해 필터링을 하고, 그것을 각각의 빨간 widget의 몸무게를 나타내는 int 값의 스트림으로 변환합니다. 그러면 이 스트림은 전체 몸무게를 구하도록 합해집니다.
- 객체 참조값들의 스트림인 Stream에 더해, 기본 자료형에 특화된 IntStream, LongStream, DoubleStream도 있고, 각각은 스트림이라고 불리며, 여기에 묘사된 특징과 제약을 따릅니다.
- 연산을 수행하기 위해서, 스트림 연산은 스트림 파이프라인으로 구성됩니다. 스트림 파이프라인은
1) 소스(예를 들어, 배열, 컬렉션, 생성 함수, I/O 채널 등),
2) 0개 혹은 그 이상의 중간 연산(예를 들어, filter(Predicate)와 같이 스트림을 다른 스트림으로 변환하는)
3) 종단 연산(count(), forEach(Consumer)와 같이 결과 혹은 side-effect를 생성하는)
으로 구성됩니다.
- 스트림은 게으릅니다. 소스 데이터에 대한 연산은 오직 종단 연산이 시작될 때 수행되고, 소스 요소는 필요한 만큼만 사용됩니다.
- 컬렉션과 스트림은 약간의 표면적인 유사성을 갖고 있지만, 목표가 다릅니다. Collections는 주로 요소에 대한 효율적인 관리와 접근에 관심을 갖습니다. 반면, 스트림은 요소에 대한 직접적인 접근 수단을 제공하지 않고, 그 대신 선언적으로 소스를 묘사하고, 해당 소스에 대해 수행될 집계 연산에 관심을 갖습니다. 하지만, 제공된 스트림 연산이 의도된 기능을 제공하지 않는다면, BaseStream.iterator() 혹은 BaseStream.spliterator() 연산이 제어된 순회를 제공합니다.
- 스트림 파이프라인은, 위의 widgets 예시와 같이, 스트림 소스에 대한 쿼리로 볼 수도 있습니다. 소스가 동시 변경(ex) ConcurrentHashMap)을 위해 명시적으로 디자인되지 않은 경우, 스트림 소스가 쿼리되고 있을 때 수정함으로써, 예측 불가능한 혹은 에러 행위가 발생할 수 있습니다.
'공식문서&논문 - 자바' 카테고리의 다른 글
log4j2 (0) | 2022.10.02 |
---|---|
BufferedReader (0) | 2022.09.27 |