본문 바로가기
카테고리 없음

자바 스트림(Stream) 사용법 & 예제

by sftt 2024. 1. 15.

자바 스트림(Stream) 사용법 & 예제

스트림(Stream)은 자바 8부터 도입된 기능으로, 컬렉션의 요소를 람다식을 이용하여 처리할 수 있는 기능을 제공합니다. 이를 통해 코드의 가독성과 간결성을 높일 수 있으며, 병렬 처리가 가능하므로 성능도 향상시킬 수 있습니다.

스트림 개념과 특징

스트림은 크게 소스, 중간 연산, 종단 연산으로 구성됩니다. 소스는 데이터의 원천이 되는 컬렉션이나 배열입니다. 중간 연산은 소스로부터 스트림을 생성하거나 스트림을 변환하는 작업이며, 종단 연산은 스트림의 요소를 소모하며 결과를 반환하는 작업입니다.

스트림은 아래의 특징을 가지고 있습니다.

  • 스트림은 데이터 소스로부터 데이터를 읽기만 할 뿐 변경하지 않습니다. 따라서 기존 데이터 소스는 변경되지 않습니다.
  • 스트림은 일회용이며, 한 번 사용하면 닫혀서 재사용할 수 없습니다.
  • 스트림은 게으르게(lazy) 처리됩니다. 즉, 최종 연산을 수행하기 전까지는 중간 연산이 수행되지 않습니다. 이를 통해 성능을 최적화합니다.

스트림 사용법

  1. 스트림 생성하기

    스트림은 다양한 방법으로 생성할 수 있습니다. 가장 기본적인 방법은 컬렉션을 이용하는 것입니다.

     List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
     Stream<Integer> stream = numbers.stream(); // 컬렉션을 스트림으로 변환

    배열을 스트림으로 변환할 때에는 Arrays.stream() 메서드를 사용합니다.

     int[] numbers = {1, 2, 3, 4, 5};
     IntStream stream = Arrays.stream(numbers); // 배열을 스트림으로 변환
  2. 중간 연산 수행하기

    중간 연산은 필터링, 정렬, 변환 등의 작업을 수행합니다. 스트림은 여러 개의 중간 연산을 연결할 수 있습니다.

     stream.filter(n -> n > 3) // 3보다 큰 수만 필터링
           .map(n -> n * 2) // 모든 수를 2배로 변환
           .forEach(System.out::println); // 결과 출력

    위의 예제에서 filter는 조건에 맞는 요소만을 걸러내고, map은 요소를 변환하고 있습니다.

  3. 종단 연산 수행하기

    종단 연산은 스트림의 요소를 소모하며, 최종 결과를 반환합니다.

     long count = stream.count(); // 스트림의 요소 개수 반환
     Optional<Integer> max = stream.max(Comparator.comparing(n -> n)); // 스트림의 요소 중 최댓값 반환

    count는 스트림의 요소 개수를 반환하고, max는 요소 중 최댓값을 반환합니다.

스트림 예제

아래는 1부터 10까지의 숫자 중에서 홀수를 걸러내고, 각 숫자를 제곱한 후 그 결과를 출력하는 예제입니다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

numbers.stream()
       .filter(n -> n % 2 == 1) // 홀수만 걸러냄
       .map(n -> n * n) // 각 숫자를 제곱함
       .forEach(System.out::println); // 결과 출력

위의 예제를 실행하면 출력 결과로 1, 9, 25, 49, 81이 나옵니다. 스트림을 사용하면 간단하게 요소를 걸러내고, 변환하며, 결과를 처리할 수 있습니다.

이상으로 자바 스트림의 사용법과 예제에 대해서 알아보았습니다. 스트림은 간결하고 가독성이 좋은 코드를 작성할 수 있도록 도와주며, 병렬 처리가 가능한 등 성능에도 큰 도움을 줍니다. 앞으로 스트림을 자유롭게 사용하여 효율적인 코드 작성을 경험해보시기 바랍니다.

댓글