woowacourse-study/2022-modern-java-in-action

스트림 연산은 어떻게 작동할까?

Opened this issue · 1 comments

문제

스트림 연산의 시작과 끝이 어떻게 이루어지는 지에 대한 고찰

선정 배경

스트림 연산을 구분하는 방법에 대한 생각 정리하기.

관련 챕터

  • [4장] 스트림 소개
  • p. 150

스트림을 통해 배열, 컬렉션 등의 데이터들을 가공할 수 있다.

이때 스트림은 생성, 중간 연산, 최종 연산 순으로 진행되는데, 최종 연산이 없으면 아무 결과도 얻지 못한다.

  • 스트림 인터페이스는 연산을 두 가지로 구분할 수 있다. - 중간 연산과 최종 연산

중간 연산이란 연결할 수 있는 스트림 연산이며 최종 연산이란 스트림을 닫는 연산이다.

중간 연산을 여러개 연결해서 질의를 만들 수 있는데, 이때 중요한 특징은 단말 연산을 스트림 파이프라인에 실행하기 전까지는 아무 연산도 수행하지 않는다는 것

  • 즉, 중간 연산을 호출하는 것은 단지 어떤 작업이 수행되어야 하는지를 지정해주는 것
  • 중간 연산을 합친 다음에 합쳐진 중간 연산을 최종 연산으로 한 번에 처리 - 이를 게으르다고 표현함
  • 중간 연산은 조건에 맞는 요소를 추출(filter()) 하거나 요소를 변환(map()) 한다
    • 예를 들어, 문자열 길이가 5보다 작은 것들로 filter하거나 플레이어 객체에서 플레이어의 이름만 가져오기
  • filter와 map은 서로 다른 연산이지만 한 과정으로 병합된다 → 루프 퓨전

최종 연산은 스트림 파이프라인에서 결과를 도출한다. 최종 연산에 의해 반환되는 결과는 List, Integer, void 등 스트림이 아닌 결과를 반환한다.

주의 - 스트림은 한 번만 소비될 수 있기 때문에 최종 연산이에 스트림은 더 이상 다른 연산을 적용할 수 없다.

  • 예시: forEach(),count(), sum(), reduce(), collect() 등이 있다