본문 바로가기

Java

Java Stream(스트림)

1. 스트림(Stream) 개요

  • 스트림이란?: 스트림은 컬렉션 데이터를 함수형 스타일로 처리할 수 있는 추상화된 연산의 연속입니다. 데이터가 처리되는 방식에 대해 선언적으로 지정할 수 있습니다.
  • 데이터 소스: 스트림은 컬렉션(List, Set), 배열, I/O 채널 등 다양한 데이터 소스에서 생성될 수 있습니다.
  • 스트림의 특징:
    • 순차적 또는 병렬적 처리: 스트림은 데이터를 순차적 또는 병렬적으로 처리할 수 있습니다.
    • 무상태: 스트림 연산은 원본 데이터를 변경하지 않으며, 처리 결과를 새 스트림으로 반환합니다.
    • 지연 평가(Lazy Evaluation): 연산은 스트림을 순회할 때까지 수행되지 않습니다. 이로 인해 불필요한 연산을 줄일 수 있습니다.

2. 스트림의 주요 연산

스트림 API는 주로 두 가지 종류의 연산을 지원합니다:

  • 중간 연산 (Intermediate Operations):
    • 필터링: filter(Predicate<T> predicate) - 조건에 맞는 요소를 필터링합니다.
    • 맵핑: map(Function<T, R> mapper) - 각 요소를 다른 형태로 변환합니다.
    • 정렬: sorted() - 요소를 정렬합니다.
    • 중복 제거: distinct() - 중복된 요소를 제거합니다.
    • 슬라이싱: skip(long n)과 limit(long maxSize) - 특정 범위의 요소를 선택합니다.
  • 종단 연산 (Terminal Operations):
    • 수집: collect(Collector<T, A, R> collector) - 스트림의 결과를 컬렉션으로 수집합니다.
    • 최소값/최대값: min(Comparator<T> comparator)와 max(Comparator<T> comparator) - 최소값과 최대값을 찾습니다.
    • 합계/평균: sum()과 average() - 숫자형 스트림에서 합계와 평균을 계산합니다.
    • 출력: forEach(Consumer<T> action) - 각 요소를 처리하는 작업을 수행합니다.
    • 배열로 변환: toArray() - 스트림을 배열로 변환합니다.

3. 스트림 사용 예제

다음은 스트림 API를 사용한 다양한 예제입니다:

 
import java.util.*;
import java.util.stream.Collectors;

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

        // 필터링: "J"로 시작하는 이름 필터링
        List<String> filteredNames = names.stream()
                                           .filter(name -> name.startsWith("J"))
                                           .collect(Collectors.toList());
        System.out.println(filteredNames); // [John, Jane]

        // 맵핑: 이름을 대문자로 변환
        List<String> upperCaseNames = names.stream()
                                            .map(String::toUpperCase)
                                            .collect(Collectors.toList());
        System.out.println(upperCaseNames); // [JOHN, JANE, TOM, LUCY, TIM, SARAH]

        // 정렬: 이름을 알파벳 순으로 정렬
        List<String> sortedNames = names.stream()
                                        .sorted()
                                        .collect(Collectors.toList());
        System.out.println(sortedNames); // [Jane, John, Lucy, Sarah, Tim, Tom]

        // 중복 제거
        List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
        List<Integer> distinctNumbers = numbers.stream()
                                                .distinct()
                                                .collect(Collectors.toList());
        System.out.println(distinctNumbers); // [1, 2, 3, 4, 5]

        // 합계와 평균
        int sum = numbers.stream()
                         .mapToInt(Integer::intValue)
                         .sum();
        double average = numbers.stream()
                                .mapToInt(Integer::intValue)
                                .average()
                                .orElse(0.0);
        System.out.println("Sum: " + sum); // Sum: 15
        System.out.println("Average: " + average); // Average: 3.0
    }
}

4. 스트림 생성

  • 컬렉션에서 스트림 생성:
  • java
    List<String> list = Arrays.asList("a", "b", "c"); Stream<String> stream = list.stream();
     
  • 배열에서 스트림 생성
  • java
    int[] array = {1, 2, 3, 4, 5}; IntStream intStream = Arrays.stream(array);
  • 범위에서 스트림 생성:
  • java
    IntStream rangeStream = IntStream.range(1, 5); // 1, 2, 3, 4

 

'Java' 카테고리의 다른 글

Java 람다 표현식  (0) 2024.07.31
Java 제네릭  (0) 2024.07.31
Java 배열  (0) 2024.07.23
Java 반복문 for, while, do-while  (0) 2024.07.23
Java 조건문 if, switch  (0) 2024.07.23