스트림은 다양한 데이터 소스를 표준화하여 다루는 방법이다.
스트림의 단계는 생성 - 중간 연산 - 최종 연산 총 3가지로 이루어져있다.
| 메서드 | 설명 |
|---|---|
filter(lambda expression) |
람다식의 조건에 맞는 요소만 필터링 |
map(lambda expression) |
각 요소에 람다식의 함수를 적용하여 변환 |
sorted() |
요소 정렬 |
distinct |
중복 제거 |
limit(long maxSize) |
스트림의 크기를 maxSize만큼 제한 |
skip(long n) |
처음 n개의 요소를 건너 뜀 |
mapToInt(lambda expression) |
식에 맞는 요소들을 IntStream으로 반환 |
| 리턴 타입 | 메서드 | 설명 |
|---|---|---|
long |
count() |
요소의 개수 반환 |
boolean |
anyMatch(lambda expression) |
람다식의 조건을 만족하는 요소가 하나라도 있다면 true 반환 |
Optional<T> |
max/min(Comparator c) |
최대/최소값을 반환, 스트림이 비어있다면 Optional[null] 반환 |
Optional<T> |
reduce(lambda expression) |
요소를 하나씩 줄여가며 연산 수행 |
R |
collect(Collector c) |
Collector.toList()등 메서드를 통해 스트림 객체를 Collector로 매핑해서 반환 |
collect를 쓰지 않고 toList()만 사용하여 List를 반환할 수 있는데,
toList()로 반환한 리스트는 수정이 불가하다.
반면 collect(Collector.toList())로 반환된 리스트는 수정이 가능하다.
• 간결성
➡️ 코드를 간결하게 만들어 코드 가독성 향상
• 선언적 데이터 처리
➡️ "무엇을" 처리할 지에 집중,
"어떻게"에 대한 부분은 Java가 지원
• 병렬 처리 용이
➡️ 병렬 처리를 쉽게 구현할 수 있음
• 함수형 프로그래밍 지원
➡️ 람다식과 함께 고차 함수를 활용하여 더 유연하고 재사용 가능한 코드 작성 가능
• 효율적인 데이터 처리
➡️ 지연 연산을 통해 필요할 때만 데이터 요소를 처리
• 에러 발생 가능성 감소
➡️ 제어문에서 발생할 수 있는 오류 발생을 최소화
• 풍부한 연산 지원
➡️ 필터링, 변환, 정렬, 집계 등 다양한 방식으로 처리할 수 있는 연산자를 지원
Stream 주의 사항
- 재사용
➡️ stream을 다시 사용하는건 안된다. 최종연산 이후 에는 재사용이 안됨.- 무한 스트림 생성
➡️ 중간 연산을 잘못하게 되면 무한 스트림에 빠질 수 있다.- 지역 변수 접근
➡️ 람다나 메서드 참조를 사용할 경우 지역변수에 접근할 수 없다.