스트림 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());
반응형
'Java' 카테고리의 다른 글
[Java] 기본 메서드(Default Methods) 개념 및 사용 방법 (0) | 2023.05.25 |
---|---|
[Java] 메서드 참조 사용 방법 (1) | 2023.05.24 |
[Java] 람다 표현식 사용 방법 (0) | 2023.05.22 |
[Spring Boot] Spring Batch + scheduler 사용해 일정 주기로 실행 방법 (0) | 2023.03.24 |
[Spring Boot / Java8] OpenAI API GPT3 사용 방법 (0) | 2023.03.23 |