본문 바로가기

Study/Java

Java Stream(스트림)

728x90

I. Java Stream이란?

· Java 8에서 도입된 기능으로, 컬렉션(Collection) 또는 배열과 같은 데이터 소스의 요소를 처리하고 변환하기 위한

  선언적이고 함수형 스타일의 API

· 스트림을 사용하면 코드가 간결해지고, 데이터 처리 작업을 병렬화하거나 효율적으로 수행할 수 있음.

 

1. 선언적 방식

· 스트림 API는 for 또는 while 루프 대신 선언적으로 데이터를 처리한다.

  (예: filter, map, collect)

 

2. 데이터 프름 중심

· 스트림은 데이터의 흐름을 처리하기 위해 사용되며 데이터 자체를 변경하지 않는다.

· 스트림은 원본 데이터를 변경하지 않는 불변성을 보장한다.

 

3. 중간 연산과 종결연산

· 중간 연산(Intermediate Operation) : 다른 스트림을 반환하며, 연산은 지연(lazy) 평가된다.

· 종결 연산 (Terminal Operation) : 스트림을 처리하고 결과를 반환합니다.
                                                      (예: collect, forEach, count)

4. 내부 반복

· 스트림 API는 개발자가 반복(iteration) 처리를 직접 하지 않고, 스트림 내부에서 반복 처리를 수행한다.

 

5. 병렬 처리

· 스트림 API는 간단한 코드 변경으로 데이터를 병렬로 처리하는 기능을 제공한다.

  (예: parallelStream())

 

6. 장점과 주의해야하는 사항.

@ 장점

· 코드 가독성 증가 (함수형 스타일로 작성)

· 데이터 처리 간결화 (필터링, 변환, 수집 등을 단순화)

· 대용량 데이터 처리에 유리 (병렬 스트림)

 

@ 주의점
· 스트림은 한 번만 소비 가능(재사용 불가)

· 병렬 스트림 사용 시 공유 자원 처리에 주의

· 중간 연산은 지연 평가되므로 결과를 보려면 종결 연산이 필요

 

@ 스트림 활용 시 고려할점.

· 병렬 스트림은 데이터의 크기와 연산의 복잡성에 따라 성능이 달라질 수 있으므로 신중히 사용.

· 함수형 인터페이스(Predicate, Function)와 람다 표현식의 조합으로 스트림을 활용하면 더욱 유용.

 

II. 스트림 API의 기본 구조

1. 스트림 생성

·  Stream.of(), Arrays.stream(), 컬렉션의 stream() 메서드를 사용하여 생성.

2. 중간 연산

· 데이터 변환 또는 필터링 작업을 수행. 

· filter(): 조건에 맞는 요소만 선택.

· map(): 각 요소를 변환.

· sorted(): 요소를 정렬.

· distinct(): 중복 제거.

3. 종결 연산

·  최종 결괄르 도출.

· collect(): 결과를 컬렉션으로 수집.

· forEach(): 각 요소를 반복 처리.

· reduce(): 모든 요소를 하나의 값으로 합침.

 

III. 예제 코드

1. 숫자 리스트에서 짝수만 필터링하여 합산.

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

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

        int sumOfEvens = numbers.stream() // 스트림 생성
                .filter(n -> n % 2 == 0)  // 중간 연산: 짝수 필터링
                .mapToInt(n -> n)        // 중간 연산: int로 변환
                .sum();                  // 종결 연산: 합산

        System.out.println("Sum of evens: " + sumOfEvens);
    }
}

2. 문자열 리스트를 대문자로 변환 후 출력.

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

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

        names.stream()                  // 스트림 생성
                .map(String::toUpperCase) // 중간 연산: 대문자로 변환
                .forEach(System.out::println); // 종결 연산: 출력
    }
}

3. 병렬 스트림 사용

import java.util.stream.IntStream;

public class ParallelStreamExample {
    public static void main(String[] args) {
        IntStream.range(1, 11)       // 1부터 10까지 범위
                .parallel()          // 병렬 스트림 생성
                .forEach(System.out::println);
    }
}
728x90