Java 8 버전에 도입된 람다(Lambda)와 스트림(Stream) API는 자바의 코딩 패러다임을 바꾼 혁명적인 기능입니다. 기존에는 컬렉션(리스트)의 데이터를 거를 때 지저분한 for문과 if문을 남발해야 했습니다.
스트림 API를 사용하면, 원본 데이터를 물줄기(Stream)에 올린 뒤, 조건에 맞게 거르고(filter), 형태를 변환하고(map), 최종적으로 묶는(collect) 과정을 마치 공장의 컨베이어 벨트처럼 선언적(Declarative)으로 매우 우아하게 작성할 수 있습니다.
💡 핵심 비유: 파이프라인 컨베이어 벨트
stream()으로 상자에 담긴 과일들을 컨베이어 벨트에 하나씩 올려놓습니다. filter()는 불량 사과를 골라내는 '거름망 로봇'입니다. map()은 사과를 깎아서 예쁜 조각으로 만드는 '가공 로봇'입니다. collect()는 가공이 끝난 과일 조각들을 다시 새로운 상자에 포장하는 '포장 로봇'입니다.
🌊 Stream 파이프라인 컨베이어 벨트
🛠️ 스트림 API 핵심 메서드 정리
메서드
분류
역할
stream()
생성
컬렉션 데이터를 스트림(물줄기)으로 올려놓습니다.
filter()
중간 연산
람다식 조건이 참(true)인 데이터만 살려두고 나머지는 걸러냅니다.
map()
중간 연산
각 데이터를 다른 형태(문자열 변경, 객체 변환 등)로 가공합니다.
collect()
최종 연산
컨베이어 벨트를 끝내고 결과를 다시 List나 Set 등으로 묶어냅니다.
Main.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
// 불변 리스트 초기화
List<String> names = Arrays.asList("Apple", "Banana", "Cherry", "Avocado", "Blueberry");
// 목표: 'A'로 시작하는 과일만 대문자로 바꿔서 새 리스트에 담기
// 1. [과거 방식 - Java 7 이전]
// 코드가 길어지고, 뎁스(if문)가 깊어져 가독성이 떨어집니다.
List<String> oldResult = new ArrayList<>();
for (String name : names) {
if (name.startsWith("A")) {
oldResult.add(name.toUpperCase());
}
}
System.out.println("[과거 방식] 결과: " + oldResult);
// 2. [모던 자바 스트림 방식 - Java 8 이후]
// 선언적 코드(무엇을 할 것인가)에 집중하여 컨베이어 벨트처럼 직관적입니다.
List<String> streamResult = names.stream() // 1. 물줄기(스트림) 생성
.filter(name -> name.startsWith("A")) // 2. 중간 연산: 'A'로 시작하는 과일만 통과 (람다식)
.map(name -> name.toUpperCase()) // 3. 중간 연산: 모두 대문자로 가공 (람다식)
.collect(Collectors.toList()); // 4. 최종 연산: 결과를 다시 List로 묶어라
System.out.println("[모던 자바 스트림 방식] 결과: " + streamResult);
}
}