Header Banner
GG Logo

Future Engineering

기술의 최전선을 기록합니다.

기술 자료/BackEnd/ [Java] 스트림 API란?

[Java] 스트림 API란?

BackEnd10개월 전

스트림 API는 Java 8에서 도입된 기능으로, 데이터의 흐름을 추상화하여 배열이나 컬렉션 등의 데이터를 간결하고 효율적으로 처리할 수 있게 해주는 도구입니다. 스트림을 사용하면 데이터의 필터링, 매핑, 정렬, 집계 등의 연산을 쉽게 수행할 수 있습니다.

 

주요 특징

  1. 데이터 파이프라인: 데이터를 하나의 흐름으로 처리하며, 여러 연산을 연결하여 수행할 수 있습니다. (예: filter, map, reduce)

  2. 지연 연산(Lazy Evaluation): 스트림의 연산은 최종 연산이 호출되기 전까지 실제로 수행되지 않습니다. 이를 통해 불필요한 계산을 줄일 수 있습니다. (쉽게 말해서, 결과를 얻기 위해 필요한 것들만 계산한다.)

  3. 병렬 처리 지원: 스트림은 병렬 처리(Parallel Stream)를 지원하여 멀티코어 환경에서 성능을 향상시킬 수 있습니다. (쉽게 말해 여러 스레드가 데이터를 병렬로 처리하여 작업을 빠르게 완료)

 

지연 연산 예시

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

public class LazyEvaluationExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("John", "Jane", "Tom", "Diana", "Mike");

        Stream<String> stream = names.stream()
            .filter(name -> {
                System.out.println("Filtering: " + name);
                return name.startsWith("J");
            })
            .map(name -> {
                System.out.println("Mapping: " + name);
                return name.toUpperCase();
            });

        // 지연 연산이므로 최종 연산을 실행하기 전까지 위의 연산들이 실행되지 않음.
        System.out.println("Before terminal operation");

        // 최종 연산이 호출되는 시점에 필터링과 매핑이 수행됨.
        stream.forEach(System.out::println);
    }
}

 

병렬 처리 예시

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

public class ParallelStreamExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("John", "Jane", "Tom", "Diana", "Mike");

        // 병렬 스트림으로 변환
        names.parallelStream()
            .filter(name -> {
                System.out.println("Filtering: " + name + " - " + Thread.currentThread().getName());
                return name.startsWith("J");
            })
            .map(name -> {
                System.out.println("Mapping: " + name + " - " + Thread.currentThread().getName());
                return name.toUpperCase();
            })
            .forEach(name -> {
                System.out.println("Final result: " + name + " - " + Thread.currentThread().getName());
            });
    }
}

 

스트림 API의 주요 메서드

  1. 중간 연산: 다른 스트림을 반환하며, 연속적으로 연결할 수 있는 연산들입니다.

    • filter(): 조건에 맞는 요소만을 필터링합니다.

    • map(): 요소를 변환합니다.

    • sorted(): 요소를 정렬합니다.

  2. 최종 연산: 스트림을 소비하여 결과를 반환하는 연산들입니다.

    • forEach(): 모든 요소에 대해 작업을 수행합니다.

    • collect(): 스트림의 결과를 컬렉션으로 반환합니다.

    • reduce(): 스트림의 요소를 하나로 결합합니다.

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

public class StreamExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("John", "Jane", "Tom", "Anna");

        // 'J'로 시작하는 이름을 필터링하고, 대문자로 변환 후 출력
        names.stream()
            .filter(name -> name.startsWith("J"))
            .map(String::toUpperCase)
            .forEach(System.out::println); // 출력 결과: JOHN, JANE
    }
}

 

스트림의 장점

  • 간결성: 람다식과 결합해 코드가 간결하고 읽기 쉬워집니다.

  • 유연성: 필터링, 변환, 집계 등 다양한 연산을 자유롭게 조합할 수 있습니다.

  • 병렬 처리: 데이터 처리 속도를 크게 향상시킬 수 있습니다.

 

스트림 API는 데이터를 처리하는 방식을 간단하게 만들고 성능 최적화까지 할 수 있습니다.

[Java] 스트림 API란? - TECH.KAKAO.GG