Java

[Java] 스트림(Stream) API 사용 방법

cob 2023. 5. 23. 10:14

 

스트림 API(Stream API)란?
Java 8부터 도입된 기능으로, 컬렉션 데이터를 처리하고 변환하는 작업을 간단하게 할 수 있는 API이다.
스트림을 사용하면 데이터 처리를 파이프라인 형식으로 연결하여 선언적으로 표현할 수 있다.

 

 

 


1. Stream API 구문

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);

        // 스트림 생성
        numbers.stream()
            // 중개 연산: 짝수만 필터링
            .filter(n -> n % 2 == 0)
            // 중개 연산: 제곱값으로 변환
            .map(n -> n * n)
            // 최종 연산: 결과 출력
            .forEach(System.out::println);
    }
}
  • 스트림 생성 
    - 컬렉션 : Collection 인터페이스의 Sream() 메서드 사용
    - 배열 : Arrays.Stream() 사용
    - 다른 데이터 : Stream 인터페이스의 정적 메서드 사용
  • 중개 연산 : 스트림에서 데이터를 변환하거나 필터링하는 작업을 수행,
    요에 따라 여러 번 연속으로 호출할 수 있으며, 체인 형태로 연결하여 작업을 정의한다.
중개 연산 메서드 설명
filter() 조건에 맞는 요소 선택
map() 요소를 다른 값으로 변환
flatMap() 스트림의 각 요소에 대해 새로운 스트림을 생성하고, 모든 스트림의 요소를 하나의 스트림으로 평면화한다.
distinct() 중복된 요소를 제거
sorted() 요소를 정렬
limit() 최대로 지정된 개수의 요소만 선택
skip() 지정된 개수의 요소를 건너뜀
peek() 요소를 소비하면서 작업을 수행
takeWhile() 주어진 조건을 만족하는 요소만 선택하며, 조건을 만족하지 않는 요소 이후의 모든 요소는 건너뜀
dropWhile() 주어진 조건을 만족하지 않는 요소까지 건너뜁니다. 조건을 만족하는 이후의 모든 요소를 선택
  • 최종 연산 : 스트림 파이프라인의 마지막에 위치하며, 실제로 데이터를 소모하고 결과를 반환하는 작업을 수행,
    최종 연산은 스트림을 닫는(스트림이 소비되고 더 이상 사용할 수 없는) 작업이다.
최종 연산 메서드 설명 반환 타입
forEach() 각 요소에 대한 작업 수행 void
toArray() 스트림 요소를 배열로 변환 T[]
reduce() 스트림 요소들을 결합 또는 집계 Optional<T>
collect() 스트림 요소들을 수집하여 컬렉션 생성 R
min() 최소값 요소 찾기 Optional<T>
max() 최대값 요소 찾기 Optional<T>
count() 요소 개수 세기 long
anyMatch() 조건을 만족하는 요소가 있는지 확인 boolean
allMatch() 모든 요소가 조건을 만족하는지 확인 boolean
noneMatch() 조건을 만족하는 요소가 없는지 확인 boolean
findFirst() 첫 번째 요소 찾기 Optional<T>
findAny() 아무 요소나 찾기 Optional<T>

 

 

 

 


2. 사용 방법

2-1) Collection

컬렉션은 많은 수의 데이터를 그 사용 목적에 적합한 자료구조로 묶어 하나로 그룹화한 객체를 말한다.
List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

List<Integer> evenNumbers = numbers.stream()
        .filter(n -> n % 2 == 0)                // 중개 연산: 짝수만 필터링
        .map(n -> n * 2)                        // 중개 연산: 각 요소에 2를 곱함
        .collect(Collectors.toList());         // 최종 연산: 결과를 List로 수집

System.out.println(evenNumbers);  // [4, 8, 12]

 

 

2-2) 배열

int[] array = {1, 2, 3, 4, 5};

int sum = Arrays.stream(array)
        .filter(n -> n > 2)                     // 중개 연산: 2보다 큰 요소만 필터링
        .map(n -> n * 3)                        // 중개 연산: 각 요소에 3을 곱함
        .sum();                                 // 최종 연산: 요소들의 합을 구함

System.out.println(sum);  // 27

 

 

 


3. 활용 

쿼리를 조회하여 Entity 리스트로 받는다 => 계층 간 데이터 교환을 위해 Stream을 사용하여 DTO 리스트로 변환한다.
(Entity : 실제 DB와 맵핑되는 클래스, DTO : 계층간 데이터 교환을 하기 위한 클래스)
// 1) 서비스 메서드 retrieve() 메서드를 사용해 Todo 리스트를 가져온다.
List<TodoEntity> entities = service.retrieve(userId);

// 2) 자바 스트림을 이용해 리턴된 엔티티 리스트를 TodoDTO 리스트로 변환한다.
List<TodoDTO> dtos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());

 

 

반응형