I. Java Stream이란?
· Java 8에서 도입된 기능으로, 컬렉션(Collection) 또는 배열과 같은 데이터 소스의 요소를 처리하고 변환하기 위한
선언적이고 함수형 스타일의 API
· 스트림을 사용하면 코드가 간결해지고, 데이터 처리 작업을 병렬화하거나 효율적으로 수행할 수 있음.
1. 선언적 방식
· 스트림 API는 for 또는 while 루프 대신 선언적으로 데이터를 처리한다.
(예: filter, map, collect)
2. 데이터 프름 중심
· 스트림은 데이터의 흐름을 처리하기 위해 사용되며 데이터 자체를 변경하지 않는다.
· 스트림은 원본 데이터를 변경하지 않는 불변성을 보장한다.
3. 중간 연산과 종결연산
· 중간 연산(Intermediate Operation) : 다른 스트림을 반환하며, 연산은 지연(lazy) 평가된다.
· 종결 연산 (Terminal Operation) : 스트림을 처리하고 결과를 반환합니다.
(예: collect, forEach, count)
4. 내부 반복
· 스트림 API는 개발자가 반복(iteration) 처리를 직접 하지 않고, 스트림 내부에서 반복 처리를 수행한다.
5. 병렬 처리
· 스트림 API는 간단한 코드 변경으로 데이터를 병렬로 처리하는 기능을 제공한다.
(예: parallelStream())
6. 장점과 주의해야하는 사항.
@ 장점
· 코드 가독성 증가 (함수형 스타일로 작성)
· 데이터 처리 간결화 (필터링, 변환, 수집 등을 단순화)
· 대용량 데이터 처리에 유리 (병렬 스트림)
@ 주의점
· 스트림은 한 번만 소비 가능(재사용 불가)
· 병렬 스트림 사용 시 공유 자원 처리에 주의
· 중간 연산은 지연 평가되므로 결과를 보려면 종결 연산이 필요
@ 스트림 활용 시 고려할점.
· 병렬 스트림은 데이터의 크기와 연산의 복잡성에 따라 성능이 달라질 수 있으므로 신중히 사용.
· 함수형 인터페이스(Predicate, Function)와 람다 표현식의 조합으로 스트림을 활용하면 더욱 유용.
II. 스트림 API의 기본 구조
1. 스트림 생성
· Stream.of(), Arrays.stream(), 컬렉션의 stream() 메서드를 사용하여 생성.
2. 중간 연산
· 데이터 변환 또는 필터링 작업을 수행.
· filter(): 조건에 맞는 요소만 선택.
· map(): 각 요소를 변환.
· sorted(): 요소를 정렬.
· distinct(): 중복 제거.
3. 종결 연산
· 최종 결괄르 도출.
· collect(): 결과를 컬렉션으로 수집.
· forEach(): 각 요소를 반복 처리.
· reduce(): 모든 요소를 하나의 값으로 합침.
III. 예제 코드
1. 숫자 리스트에서 짝수만 필터링하여 합산.
import java.util.Arrays;
import java.util.List;
public class StreamExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
int sumOfEvens = numbers.stream() // 스트림 생성
.filter(n -> n % 2 == 0) // 중간 연산: 짝수 필터링
.mapToInt(n -> n) // 중간 연산: int로 변환
.sum(); // 종결 연산: 합산
System.out.println("Sum of evens: " + sumOfEvens);
}
}
2. 문자열 리스트를 대문자로 변환 후 출력.
import java.util.Arrays;
import java.util.List;
public class StreamExample2 {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream() // 스트림 생성
.map(String::toUpperCase) // 중간 연산: 대문자로 변환
.forEach(System.out::println); // 종결 연산: 출력
}
}
3. 병렬 스트림 사용
import java.util.stream.IntStream;
public class ParallelStreamExample {
public static void main(String[] args) {
IntStream.range(1, 11) // 1부터 10까지 범위
.parallel() // 병렬 스트림 생성
.forEach(System.out::println);
}
}
'Study > Java' 카테고리의 다른 글
Java 컬렉션 프레임워크인가 아닌가..? (1) | 2025.01.21 |
---|---|
Java 컬렉션 프레임워크란? (1) | 2025.01.19 |
객체지향 프로그래밍 7장(30강 ~ 35강) (0) | 2022.06.07 |
객체지향 프로그래밍 7장(25강 ~ 29강) (0) | 2022.06.06 |
객체지향 프로그래밍 7장(20강 ~ 24강) (0) | 2022.06.06 |