1. 스트림(Stream) 개요
- 스트림이란?: 스트림은 컬렉션 데이터를 함수형 스타일로 처리할 수 있는 추상화된 연산의 연속입니다. 데이터가 처리되는 방식에 대해 선언적으로 지정할 수 있습니다.
- 데이터 소스: 스트림은 컬렉션(List, Set), 배열, I/O 채널 등 다양한 데이터 소스에서 생성될 수 있습니다.
- 스트림의 특징:
- 순차적 또는 병렬적 처리: 스트림은 데이터를 순차적 또는 병렬적으로 처리할 수 있습니다.
- 무상태: 스트림 연산은 원본 데이터를 변경하지 않으며, 처리 결과를 새 스트림으로 반환합니다.
- 지연 평가(Lazy Evaluation): 연산은 스트림을 순회할 때까지 수행되지 않습니다. 이로 인해 불필요한 연산을 줄일 수 있습니다.
2. 스트림의 주요 연산
스트림 API는 주로 두 가지 종류의 연산을 지원합니다:
- 중간 연산 (Intermediate Operations):
- 필터링: filter(Predicate<T> predicate) - 조건에 맞는 요소를 필터링합니다.
- 맵핑: map(Function<T, R> mapper) - 각 요소를 다른 형태로 변환합니다.
- 정렬: sorted() - 요소를 정렬합니다.
- 중복 제거: distinct() - 중복된 요소를 제거합니다.
- 슬라이싱: skip(long n)과 limit(long maxSize) - 특정 범위의 요소를 선택합니다.
- 종단 연산 (Terminal Operations):
- 수집: collect(Collector<T, A, R> collector) - 스트림의 결과를 컬렉션으로 수집합니다.
- 최소값/최대값: min(Comparator<T> comparator)와 max(Comparator<T> comparator) - 최소값과 최대값을 찾습니다.
- 합계/평균: sum()과 average() - 숫자형 스트림에서 합계와 평균을 계산합니다.
- 출력: forEach(Consumer<T> action) - 각 요소를 처리하는 작업을 수행합니다.
- 배열로 변환: toArray() - 스트림을 배열로 변환합니다.
3. 스트림 사용 예제
다음은 스트림 API를 사용한 다양한 예제입니다:
import java.util.*;
import java.util.stream.Collectors;
public class StreamExamples {
public static void main(String[] args) {
List<String> names = Arrays.asList("John", "Jane", "Tom", "Lucy", "Tim", "Sarah");
// 필터링: "J"로 시작하는 이름 필터링
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("J"))
.collect(Collectors.toList());
System.out.println(filteredNames); // [John, Jane]
// 맵핑: 이름을 대문자로 변환
List<String> upperCaseNames = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(upperCaseNames); // [JOHN, JANE, TOM, LUCY, TIM, SARAH]
// 정렬: 이름을 알파벳 순으로 정렬
List<String> sortedNames = names.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedNames); // [Jane, John, Lucy, Sarah, Tim, Tom]
// 중복 제거
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(distinctNumbers); // [1, 2, 3, 4, 5]
// 합계와 평균
int sum = numbers.stream()
.mapToInt(Integer::intValue)
.sum();
double average = numbers.stream()
.mapToInt(Integer::intValue)
.average()
.orElse(0.0);
System.out.println("Sum: " + sum); // Sum: 15
System.out.println("Average: " + average); // Average: 3.0
}
}
4. 스트림 생성
- 컬렉션에서 스트림 생성:
-
java
List<String> list = Arrays.asList("a", "b", "c"); Stream<String> stream = list.stream();
- 배열에서 스트림 생성:
- java
int[] array = {1, 2, 3, 4, 5}; IntStream intStream = Arrays.stream(array);
- 범위에서 스트림 생성:
-
java
IntStream rangeStream = IntStream.range(1, 5); // 1, 2, 3, 4
'Java' 카테고리의 다른 글
Java 람다 표현식 (0) | 2024.07.31 |
---|---|
Java 제네릭 (0) | 2024.07.31 |
Java 배열 (0) | 2024.07.23 |
Java 반복문 for, while, do-while (0) | 2024.07.23 |
Java 조건문 if, switch (0) | 2024.07.23 |