Stream2
title: 2025-08-17 (날짜) author: 강병호 (이름) date: 2025-08-17 (날짜) category: TIL/강병호/2025/08 (파일 경로 : TIL/{이름}/{연}/{월}) layout: post (자유) —
4.4 스트림 연산
java.util.stream.Stream
인터페이스는 많은 연산을 정의한다. 이러한 스트림 인터페이스에서 제공하는 연산은 크게 두 가지로 분류 된다.
중간 연산
연결할 수 있는 스트림 연산으로 위에서 filter
, map
, limit
과 같은 연산들이다.
이런 중간 연산은 다른 스트림을 반환하는데 이를 연결하여 새로운 질의를 생성할 수 있다.
이러한 중간 연산은 다음의 중요 특징을 가진다.
단말 연산을 스트림 파이프라인에 실행하기까지 아무 연산도 수행하지 않는다.
이는 lazy라는 특징을 가지며 중간 연산을 합친 다음 합쳐진 중간 연산을 최종 연산으로 한 번에 처리하는 것을 의미한다.
이러한 특징은 다음의 코드에서 최적화 효과를 가질 수 있다.
```
List<String> names =
menu.stream()
.filter(dish -> {
System.out.println("filtering: " + dish.getName());
return dish.getCalories() > 300;
})
.map(dish -. {
System.out.println("mapping: " + dish.getName());
return dish.getName();
})
.limit(3)
.collect(toList());
// result
filtering:pork
mapping:pork
filtering:beef
mapping:beef
filtering:chicken
mapping:chicken
```
- Short-Circuit : 여러 데이터 중 처음 3개만 선택되게 한다.
- loop fusion : filter, map과 같은 다른 연산의 병합
최종 연산
스트림을 닫는 연산으로 collect
와 같은 파이프라인의 실행을 마무리하는, 결과를 도출하는 것이다. 보통 이에 의해 List
, Integer
, void
등의 스트림이 아닌 결과가 반환된다.
menu.stream.forEach(System.out::pringln)
해당하는 코드는 void를 반환하는 스트림 최종 연산이다.
스트림 이용 과정
이러한 연산들을 종합하여 스트림을 이용하는 과정은 다음과 같다.
- 질의를 수행할 데이터 소스
- 스트림 파이프라인을 구성할 중간 연산 연결
- 파이프라인 실행 후 결과를 만들 최종 연산