스트림(Stream) API란?
스트림 API란, Collection에 추가된 메서드들의 집합을 말한다. 쉽게 말해, 컬렉션에 담긴 데이터들을 흐름으로 처리하는 도구이다.
스트림 API를 활용하면 코드가 간결해지고, 개발자는 데이터를 효율적으로 처리할 수 있다는 장점이 있다.
스트림 API 연산의 3단계
Stream 객체는 3단계의 과정을 거쳐 처리되는데, 3단계는 아래와 같다.
① Stream 생성 (Source)
stream() 또는 Array.stream() 등의 메서드로 스트림을 생성한다.
List<Integer> list = List.off(1, 2, 3);
list.stream();
int[] arr = {1, 2, 3};
Arrays.stream(arr);
② 중간 연산 (Intermediate Operations)
데이터를 변환 or 필터링 or 정렬하는 등의 작업이 이루어진다. 작업 후에는 새로운 Stream 객체를 반환한다.
체인처럼 여러개를 연결할 수 있고, 최종 결과가 나와야 중간 연산이 실제로 동작한다. (지연 실행, Lazy Evaluation)
ex) filter(), map(), sorted(), distinct(), limit(), skip()
③ 최종 연산 (Terminal Operation)
결과를 반환하는 연산으로, 최종 연산이 호출된 후에 중간 연산이 실제로 수행된다!
ex) collect(), forEach(), reduce(), count() 등
참고
객체.Stream생성().중간연산().최종연산()
위와 같은 형태로 한줄의 코드로 Stream을 처리할 수도 있다!
아래 예시를 보자.
List.of(1, 2, 3).stream() // Stream 객체 생성
.filter(n -> n % 2 == 0) // 중간 연산 - 짝수만 필터링하기
.map(n -> n * n) // 중간 연산 - 제곱 연산 수행하기
.forEach(System.out::println); // 최종 연산: 출력
스트림 API의 특징
1. 원본 데이터를 직접 변경하지 않는다.
Stream API는 원본 데이터를 직접 변경하지 않고, 원본 데이터를 조회하여 별도의 스트림 객체를 생성한다.
따라서 Stream API를 활용하여 정렬, 필터링 등의 기능을 수행하더라도 원본 데이터는 그대로 보존된다.
2. 재사용이 불가능하다.
재사용이 가능한 Collection과는 달리, Stream API는 사용된 후 닫힌 이후에 재사용이 불가능하다. (이후 또 사용하려면 새로운 Stream을 생성해야 한다.)
3. 내부 반복
내부적으로 반복문을 처리한다. => 코드가 간결해진다!
4. 연속 처리 & 병렬 처리 가능
여러 작업(정렬, 필터링, 변환 등)을 체인 구조처럼 연속적으로 처리가 가능하다.
또한, 병렬 처리가 가능해, 대량의 데이터를 처리할 때 성능을 높일 수 있다. (parallelStream() 메서드)
5. 종료 연산이 필수적이다.
filert, map과 같은 중간 연산은 데이터를 변환하지만, 종료 연산이 수행되어야 최종 결과를 얻을 수 있다.
정리
Stream API는 데이터를 손쉽게 변형, 정렬, 필터링할 수 있는 강력한 기능이므로 활용법을 알아둔다면 훨씬 더 깔끔한 코드 작성이 가능하다!
조만간 자주 쓰이는 Stream API의 메서드들을 하나씩 포스팅해보도록 하겠다 :)
'Java' 카테고리의 다른 글
[Java] - Stream API ⓛ forEach() 사용법 정리 (0) | 2025.02.15 |
---|---|
[Java] - 람다 표현식(Lamda expression) (0) | 2025.02.13 |
[Java] - ArrayList 기본 사용법 (0) | 2024.07.10 |
[Java] - 컬렉션(Collection) 이란? (0) | 2024.07.04 |