Java 8에서 도입된 스트림(Stream)은 컬렉션 데이터를 필터링, 변환, 집계 등의 기능을 통해 처리할 수 있다. 스트림을 사용하면 선언적이고 간결한 코드를 작성하여 데이터 처리 로직을 구현할 수 있다.
이번 글에서는 스트림의 생성부터 가공, 그리고 결과 생성까지 단계별로 알아보자.
생성하기
배열 스트림 생성
배열을 스트림으로 변환하려면 Arrays.stream() 또는 Stream.of() 메서드를 사용할 수 있다.
컬렉션 스트림 생성
컬렉션 프레임워크의 클래스들은 기본적으로 stream() 메서드를 제공하여 스트림을 생성할 수 있다.
빈 스트림 생성
빈 스트림은 Stream.empty()를 사용하여 생성할 수 있다.
Stream.builder()
수동으로 개별 요소를 추가하여 스트림을 생성한다.
요소의 수나 값이 동적으로 결정될 때 유용하며 빌더 패턴을 사용하여 스트림을 구성한다.
Stream.generate()
Supplier <T>를 통해 독립적인 요소를 생성하며 이전 요소와 무관하다.
무작위 값이나 동일한 값을 반복 생성할 때 사용하며 본질적으로 무한 스트림이므로 limit()를 사용하여 크기를 제한해야 한다.
Stream.iterate()
초기값과 함수를 받아 이전 요소를 기반으로 다음 요소를 계산하여 스트림을 생성한다.
수열이나 연속적인 값을 생성할 때 적합하며 초기값과 업데이트 함수를 사용하여 요소를 생성한다.
기본 타입형 스트림
Java는 기본 타입(int, long, double)에 대한 특수화된 스트림을 제공한다.
예를 들어 IntStream, LongStream, DoubleStream 등이 있다.
문자열 스트림
문자열을 문자 단위로 스트림 처리할 수 있다.
파일 스트림
파일의 각 행을 스트림으로 읽어 들일 수 있다.
병렬 스트림
스트림은 손쉽게 병렬 처리를 지원한다.
parallelStream() 또는 stream().parallel()을 사용하여 병렬 스트림을 생성할 수 있다.
🔥 병렬 스트림은 멀티스레드를 사용하므로 스레드 안전성에 주의해야 한다.
스트림 연결하기
Stream.concat()을 사용하여 두 개의 스트림을 연결할 수 있다.
가공하기
Filtering
필터링은 특정 조건에 맞는 요소만 추출한다.
- filter(Predicate): 조건을 만족하는 요소만 남긴다.
Mapping
매핑은 각 요소를 다른 형태로 변환한다.
- map(Function): 요소를 변환한다.
- flatMap(Function): 중첩된 구조를 평탄화한다.
Sorting
정렬은 스트림의 요소를 순서대로 배치한다.
커스텀 Comparator 사용
- sorted(): 자연 순서로 정렬한다.
- sorted(Comparator): 커스텀 정렬 기준을 사용한다.
Iterating
각 요소에 대해 특정 작업을 수행한다.
- forEach(Consumer): 각 요소에 대해 작업을 수행한다.
결과 만들기
Calculating
계산은 스트림의 요소를 이용해 합계나 평균 등을 구한다.
Reduction
리덕션은 모든 요소를 하나의 결과로 합친다.
- reduce(identity, BinaryOperator): 초기값과 결합 함수를 사용하여 리덕션 수행.
- reduce(BinaryOperator): 초기값 없이 리덕션 수행, 결과는 Optional로 반환.
Collecting
컬렉팅은 스트림의 요소를 컬렉션으로 수집한다.
- collect(Collector): 결과를 다양한 형태로 수집.
- Collectors 클래스는 여러 유용한 컬렉터를 제공.
Matching
매칭은 스트림의 요소가 특정 조건에 맞는지 검사한다.
- anyMatch(Predicate): 조건에 맞는 요소가 하나라도 있는지 확인.
- allMatch(Predicate): 모든 요소가 조건을 만족하는지 확인.
- noneMatch(Predicate): 모든 요소가 조건을 만족하지 않는지 확인.
Iterating
이터레이팅은 요소를 순회하며 처리한다.
🔥 스트림은 일회용이므로 한 번 사용한 스트림은 재사용할 수 없다.
'Dev > Java' 카테고리의 다른 글
『Java』 배열과 리스트의 차이점 (0) | 2024.11.29 |
---|---|
『Java』 Map, Stack, Queue, Deque (0) | 2024.11.28 |
『Java』 내부 클래스, 정적 중첩 클래스, 지역 클래스, 익명 클래스 (0) | 2024.11.24 |
『Java』 스레드는 어떻게 메모리를 공유하는가? (0) | 2024.11.22 |
『Java』 HashMap은 어떤 원리로 동작하는가 (0) | 2024.11.22 |