⚡ Java 8 Stream API 완벽 요약: 기본부터 필수 메소드까지
Java 8부터 도입된 Stream API는 컬렉션 데이터를 다루는 방식을 혁신적으로 변화시켰습니다. 데이터를 선언적이고 함수형으로 처리하여 코드를 훨씬 간결하고 가독성 높게 만들어 줍니다.
1. ✨ Stream 생성 및 기본 데이터
컬렉션에서 Stream을 생성하는 가장 일반적인 방법과 예시 데이터입니다.
import java.util.List;
import java.util.Arrays;
import java.util.stream.Collectors;
// List에서 Stream 생성
List<String> names = Arrays.asList("a", "b", "c", "d");
// names.stream() 으로 Stream 시작
2. 🔧 중간 연산 (Intermediate Operations)
Stream을 변형하거나 필터링하며, 최종 연산이 호출되기 전까지 실행되지 않습니다 (**지연 실행**).
2.1. `filter()`: 조건에 맞는 요소 선택
특정 조건을 만족하는 요소만 다음 Stream으로 전달합니다.
// "a"만 필터링하여 남깁니다.
names.stream().filter(i -> i.equals("a"));
// 결과: size 1 (Stream 내부에 "a"만 존재)
2.2. `map()`: 요소 변환 (매핑)
Stream의 각 요소를 다른 형태로 변환합니다.
names.stream()
.filter(i -> i.equals("a"))
.map(s -> s.toUpperCase())
.collect(Collectors.toList());
// 최종 결과: List<String> -> ["A"]
2.3. `sorted()`: 정렬
Stream의 요소를 정렬하는 데 사용됩니다.
// 1. 기본 정렬 (Comparable 인터페이스 기준)
stream().sorted();
// 2. 람다를 사용한 사용자 정의 정렬 (오름차순 예시)
stream().sorted( (a, b) -> a.compareTo(b) );
// 3. Comparator 유틸리티 사용 (자연 순서)
stream().sorted( Comparator.naturalOrder());
3. 🏁 최종 연산 (Terminal Operations)
Stream 파이프라인을 종료하고 결과를 반환합니다. 이 연산이 호출될 때 중간 연산들이 비로소 실행됩니다.
3.1. 집계(Aggregation) 관련 메소드 (주로 숫자 Stream)
IntStream, LongStream, DoubleStream과 같은 기본 타입 Stream에서 유용합니다.
- `count()`: 요소의 총 개수를 반환.
- `min()`, `max()`: 최소/최대 값을 `Optional`로 반환.
- `sum()`: 모든 요소의 합을 반환.
- `average()`: 모든 요소의 평균을 `OptionalDouble`로 반환.
3.2. `findFirst()`: 첫 번째 요소 검색
Stream에서 조건을 만족하는 **첫 번째 요소**를 찾습니다.
// Stream에서 첫 번째 요소를 Optional로 반환 후, get()으로 값 획득 (위험할 수 있음)
String firstElement = names.stream().findFirst().get();
// 결과: "a"
**Optional 사용 권장:** `findFirst()`는 `Optional`을 반환합니다. `get()` 대신 `isPresent()` 확인이나 `orElse()`를 사용하여 안전하게 처리하는 것이 좋습니다.
3.3. `collect()`: 결과 수집
Stream의 요소들을 List, Set, Map 등 원하는 형태의 컬렉션으로 수집합니다. (가장 일반적인 최종 연산)
댓글
댓글 쓰기