반응형
Stream이란?
Stream은 Java 8에서 도입된 기능으로, 컬렉션이나 배열 등의 데이터를 효율적으로 처리할 수 있도록 도와주는 API입니다. 스트림을 활용하면 데이터의 필터링, 변환, 정렬, 집계 등의 연산을 간결하고 직관적으로 수행할 수 있습니다.
Stream의 주요 특징
- 연속적이고 선언적인 처리: 데이터를 반복문 없이 함수형 스타일로 처리할 수 있습니다.
- 불변성: 원본 데이터를 변경하지 않고 새로운 스트림을 생성하여 처리합니다.
- 지연 연산: 최종 연산(Terminal Operation)이 호출될 때까지 중간 연산(Intermediate Operation)이 실행되지 않습니다.
- 병렬 처리 가능:
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()
등의 연산을 적절히 활용하여 원하는 데이터를 쉽고 빠르게 처리할 수 있습니다. 또한, 병렬 스트림을 이용하면 대용량 데이터 처리 성능을 향상시킬 수 있습니다.
반응형
'개발 부트캠프 > 백엔드' 카테고리의 다른 글
[Spring] 환경 변수 설정 (0) | 2025.02.15 |
---|---|
[Spring] @Component와 @Bean의 차이점 (0) | 2025.02.15 |
[Spring] DTO(Data Transfer Object) (0) | 2025.02.15 |
[Spring] JPA(Java Persistence API) (0) | 2025.02.15 |
[Spring] 서버가 클라이언트한테 데이터를 전달 하는 방법 (0) | 2025.02.13 |