본문 바로가기

개발 생산성 & 코드 최적화/코드 리팩토링 & 최적화

Java 스트림(Stream) API 완벽 가이드: 기본 개념부터 활용까지

[Java] Java 스트림(Stream) API 완벽 가이드: 기본 개념부터 활용까지

1. Java Stream API란?

Java 8에서 도입된 Stream API는 컬렉션(List, Set, Map 등)의 요소를

**함수형 프로그래밍 방식**으로 처리할 수 있도록 도와줍니다.

반복문(for)을 사용하는 기존 방식보다 코드가 간결하고 가독성이 좋아지는 장점이 있습니다.

2. Stream의 주요 특징

  • ✔ **데이터를 한 번만 처리** (반복 사용 불가)
  • ✔ **원본 컬렉션을 변경하지 않음** (Immutable)
  • ✔ **함수형 스타일의 코드 작성 가능**
  • ✔ **병렬 처리(Parallel Processing) 지원**

3. Stream 기본 사용법

Stream을 활용하여 리스트 데이터를 필터링, 변환, 집계하는 방법을 살펴보겠습니다.


import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamExample {
    public static void main(String[] args) {
        List names = Arrays.asList("Alice", "Bob", "Charlie", "David");

        // 1. "C"로 시작하는 이름만 필터링
        List filteredNames = names.stream()
                .filter(name -> name.startsWith("C"))
                .collect(Collectors.toList());

        System.out.println(filteredNames); // 출력: [Charlie]
    }
}

4. Stream 주요 연산

메서드 설명 예제 코드
filter() 조건을 만족하는 요소만 필터링 stream.filter(x -> x > 10)
map() 각 요소를 변환 stream.map(String::toUpperCase)
sorted() 데이터 정렬 stream.sorted()
limit(n) n개의 요소만 반환 stream.limit(5)
collect() 결과를 컬렉션으로 변환 stream.collect(Collectors.toList())

5. Stream을 활용한 데이터 변환

List 데이터를 대문자로 변환하는 예제입니다.


import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamTransform {
    public static void main(String[] args) {
        List names = Arrays.asList("Alice", "Bob", "Charlie");

        List upperCaseNames = names.stream()
                .map(String::toUpperCase)
                .collect(Collectors.toList());

        System.out.println(upperCaseNames); // 출력: [ALICE, BOB, CHARLIE]
    }
}

6. Stream을 활용한 데이터 집계

숫자 리스트에서 합계를 구하는 예제입니다.


import java.util.Arrays;
import java.util.List;

public class StreamSum {
    public static void main(String[] args) {
        List numbers = Arrays.asList(1, 2, 3, 4, 5);

        int sum = numbers.stream()
                .mapToInt(Integer::intValue)
                .sum();

        System.out.println(sum); // 출력: 15
    }
}

7. Parallel Stream을 활용한 병렬 처리

대량의 데이터를 처리할 때 parallelStream()을 사용하면 여러 CPU 코어를 활용하여 성능을 향상시킬 수 있습니다.


import java.util.Arrays;
import java.util.List;

public class ParallelExample {
    public static void main(String[] args) {
        List names = Arrays.asList("Alice", "Bob", "Charlie", "David");

        names.parallelStream()
                .forEach(name -> System.out.println(Thread.currentThread().getName() + " : " + name));
    }
}

✅ **주의사항:** - **Parallel Stream은 무조건 빠른 것이 아님**

→ 작은 데이터셋에서는 오히려 성능 저하 가능

- **멀티스레드 환경에서 동기화 문제 발생 가능**

📌 정리

  • ✔ Java Stream API는 함수형 프로그래밍 스타일을 적용할 수 있도록 도와줌
  • filter(), map(), sorted(), limit() 등의 연산을 활용하여 데이터를 효과적으로 변환 가능
  • collect()를 사용하여 리스트, 맵 등으로 변환 가능
  • parallelStream()을 활용하면 병렬 처리 가능하지만 신중하게 사용해야 함

🔗 다른 Java 최적화 관련 글도 함께 확인해보세요!

Java 람다 표현식(Lambda) 개념과 활용법