04. 스트림 소개

4.1 스트림이란 무엇인가#

Java8 스트림 특징#

  • 선언형: 더 간결하고 가독성이 좋아짐
  • 조립할 수 있음: 유연성이 좋아짐
  • 병렬화: 성능이 좋아짐

단점#

  • 스트림 연산은 비싸다

4.2 스트림 시작하기#

스트림이란 '데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소' 로 정의할 수 있음

public class PipelineTest {
List<Dish> menu; // 데이터 소스
// 생략...
@Test
void testPipeline() {
List<String> threeHighCaloricDishNames =
menu.stream() // 연속된 스트림
.filter(dish -> dish.getCalories() > 300) // 데이터 처리 연산
.map(Dish::getName)
.limit(3) // 여기까지 모든과정이 파이프라인
.collect(Collectors.toList()); // 파이프라인 결과를 리스트로 반환
}
}

4.3 스트림과 컬렉션#

  • 데이터를 언제 계산하는가
    • 컬렉션은 모든걸 메모리에 올려야함
    • 스트림은 요청할 때만 요소를 계산하는 고정된 자료구조
  • 스트림은 한 번만 탐색할 수 있다.
    • 스트림을 재사용할 순 없음

외부반복 내부반복#

  • 외부반복 (컬렉션): 사용자가 직접 요소를 반복해야함
  • 내부반복 (스트림): 어떤 작업을 수행할지만 알려주면 알아서 내부적으로 처리하고 저장함

4.4 스트림 연산#

  • 중간 연산 (intermediate operation)
    • filter, map, limit 같이 스트림 중간 처리과정을 연결하는 연산
  • 최종 연산 (terminal operation)
    • collect와 같이 스트림을 닫는 연산

중간 연산#

  • 최종 연산을 실행하기 전까지는 아무 연산도 수행되지 않음
  • 쇼트서킷: limit 과 같은 연산 (5장)
  • 루프 퓨전: filter, map은 서로 다른 연산이지만 한과정으로 병홥됨
  • filter, map, limit, sorted, distinct 등이 있음

최종 연산#

  • 스트림 파이프라인에 결과를 도출
  • forEach, count, collect 와 같은 연산이 있음

스트림 이용과정#

  • 질의를 수행할 데이터 소스
  • 스트림 파이프라인을 구성할 중간 연산 연결
  • 스트림 파이프라인을 실행하고 결과를 만들 최종연산

4.6 마치며#

  • 스트림은 소스에서 추출된 연속 요소, 데이터 처리 연산을 지원
  • 스트림은 내부 반복을 지원
  • 스트릠은 중간 연산과 최종 연산으로 이루어져 있음
  • 스트림의 요소는 요청할 때 게으르게 계산됨 (최종 연산 전까진 중간 연산이 수행되지 않음 등)
Last updated on