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
```
  1. Short-Circuit : 여러 데이터 중 처음 3개만 선택되게 한다.
  2. loop fusion : filter, map과 같은 다른 연산의 병합

최종 연산

스트림을 닫는 연산으로 collect와 같은 파이프라인의 실행을 마무리하는, 결과를 도출하는 것이다. 보통 이에 의해 List, Integer, void 등의 스트림이 아닌 결과가 반환된다.

menu.stream.forEach(System.out::pringln) 해당하는 코드는 void를 반환하는 스트림 최종 연산이다.

스트림 이용 과정

이러한 연산들을 종합하여 스트림을 이용하는 과정은 다음과 같다.

  1. 질의를 수행할 데이터 소스
  2. 스트림 파이프라인을 구성할 중간 연산 연결
  3. 파이프라인 실행 후 결과를 만들 최종 연산

results matching ""

    No results matching ""