반응형

Stream이란?

Stream은 Java 8에서 도입된 기능으로, 컬렉션이나 배열 등의 데이터를 효율적으로 처리할 수 있도록 도와주는 API입니다. 스트림을 활용하면 데이터의 필터링, 변환, 정렬, 집계 등의 연산을 간결하고 직관적으로 수행할 수 있습니다.


Stream의 주요 특징

  1. 연속적이고 선언적인 처리: 데이터를 반복문 없이 함수형 스타일로 처리할 수 있습니다.
  2. 불변성: 원본 데이터를 변경하지 않고 새로운 스트림을 생성하여 처리합니다.
  3. 지연 연산: 최종 연산(Terminal Operation)이 호출될 때까지 중간 연산(Intermediate Operation)이 실행되지 않습니다.
  4. 병렬 처리 가능: parallelStream()을 활용하면 멀티코어 환경에서 성능을 향상시킬 수 있습니다.

Stream 사용법

1. 스트림 생성

컬렉션, 배열, Stream.of() 메서드를 활용하여 스트림을 생성할 수 있습니다.

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

public class StreamExample {
    public static void main(String[] args) {
        // 리스트에서 스트림 생성
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        Stream<String> streamFromList = names.stream();

        // 배열에서 스트림 생성
        String[] nameArray = {"Alice", "Bob", "Charlie"};
        Stream<String> streamFromArray = Arrays.stream(nameArray);

        // 직접 요소를 지정하여 스트림 생성
        Stream<String> streamDirect = Stream.of("Alice", "Bob", "Charlie");
    }
}

2. 중간 연산 (Intermediate Operations)

중간 연산은 최종 연산이 호출될 때까지 실행되지 않으며, 스트림을 변환하는 역할을 합니다.

1) filter() - 조건에 맞는 요소만 선택

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
    .filter(n -> n % 2 == 0)
    .forEach(System.out::println); // 출력: 2, 4

2) map() - 요소 변환

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
    .map(String::toUpperCase)
    .forEach(System.out::println); // 출력: ALICE, BOB, CHARLIE

3) sorted() - 정렬

List<Integer> numbers = Arrays.asList(5, 3, 8, 1);
numbers.stream()
    .sorted()
    .forEach(System.out::println); // 출력: 1, 3, 5, 8

3. 최종 연산 (Terminal Operations)

최종 연산은 스트림을 소비하고 결과를 반환합니다.

1) collect() - 결과를 리스트로 변환

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> upperNames = names.stream()
                                .map(String::toUpperCase)
                                .collect(Collectors.toList());
System.out.println(upperNames); // 출력: [ALICE, BOB, CHARLIE]

2) count() - 요소 개수 반환

long count = names.stream().count();
System.out.println(count); // 출력: 3

3) findFirst() - 첫 번째 요소 찾기

Optional<String> firstName = names.stream().findFirst();
firstName.ifPresent(System.out::println); // 출력: Alice

4. 병렬 스트림

parallelStream()을 사용하면 여러 개의 스레드를 활용하여 병렬로 데이터 처리를 수행할 수 있습니다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
numbers.parallelStream()
        .filter(n -> n % 2 == 0)
        .forEach(System.out::println);

마무리

Stream API를 활용하면 코드의 가독성과 유지보수성을 높이면서도 효율적인 데이터 처리를 할 수 있습니다. filter(), map(), sorted(), collect() 등의 연산을 적절히 활용하여 원하는 데이터를 쉽고 빠르게 처리할 수 있습니다. 또한, 병렬 스트림을 이용하면 대용량 데이터 처리 성능을 향상시킬 수 있습니다.

 

반응형

+ Recent posts