컬렉션이나 배열의 데이터 요소들을 루프문 없이 선언형 방식으로 가공, 필터링, 변환, 집계할 수 있는 스트림 API(Stream API) 파이프라인을 학습합니다.
1. 스트림 API 용어 사전 (Glossary)
- Stream Pipeline: 데이터 소스 $ ightarrow$ 중간 연산(Intermediate Operations) $ ightarrow$ 최종 연산(Terminal Operation)으로 연결되는 데이터 처리 흐름입니다.
- Intermediate Operation (중간 연산):
filter(),map(),sorted()처럼 스트림을 반환하며 연속 체이닝이 가능한 연산입니다. (지연 연산 Lazy Evaluation 수행) - Terminal Operation (최종 연산):
collect(),forEach(),reduce()처럼 스트림 파이프라인을 실행하고 결과를 도출해내는 마감 연산입니다. - Parallel Stream (병렬 스트림): ForkJoinPool 프레임워크를 이용해 대용량 컬렉션을 멀티코어 CPU에서 병렬 분할 처리하는 스트림입니다. (
parallelStream())
2. 스트림 파이프라인 실전 가공 예제
import java.util.*;
import java.util.stream.Collectors;
class Person {
String name;
int age;
public Person(String name, int age) { this.name = name; this.age = age; }
public String getName() { return name; }
public int getAge() { return age; }
}
public class StreamExample {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("홍길동", 25),
new Person("이순신", 45),
new Person("강감찬", 30),
new Person("유관순", 18)
);
// [요구사항] 나이가 20세 이상인 사람들의 이름을 추출하여 성인 목록 리스트로 만들기
List<String> adultNames = people.stream()
.filter(p -> p.getAge() >= 20) // 중간 연산: 20세 이상 필터링
.map(Person::getName) // 중간 연산: 이름만 추출 (타입 변환)
.sorted() // 중간 연산: 가나다순 정렬
.collect(Collectors.toList()); // 최종 연산: List 컬렉션으로 수집
System.out.println("성인 회원 명단: " + adultNames);
}
}
3. 자주 묻는 질문 (Q&A)
Q. 스트림을 한 번 최종 연산한 후 다시 재사용할 수 있나요? A. 안 됩니다! 스트림은 1회용(Single-use)이므로 최종 연산이 호출되어 닫힌 스트림은 재사용이 불가능하며, 필요하다면 새 스트림을 다시 생성해야 합니다.