[Java] 스트림 API란?
KUKJIN LEE • 1개월 전 작성
스트림 API는 Java 8에서 도입된 기능으로, 데이터의 흐름을 추상화하여 배열이나 컬렉션 등의 데이터를 간결하고 효율적으로 처리할 수 있게 해주는 도구입니다. 스트림을 사용하면 데이터의 필터링, 매핑, 정렬, 집계 등의 연산을 쉽게 수행할 수 있습니다.
주요 특징
-
데이터 파이프라인: 데이터를 하나의 흐름으로 처리하며, 여러 연산을 연결하여 수행할 수 있습니다. (예:
filter
,map
,reduce
) -
지연 연산(Lazy Evaluation): 스트림의 연산은 최종 연산이 호출되기 전까지 실제로 수행되지 않습니다. 이를 통해 불필요한 계산을 줄일 수 있습니다. (쉽게 말해서, 결과를 얻기 위해 필요한 것들만 계산한다.)
-
병렬 처리 지원: 스트림은 병렬 처리(Parallel Stream)를 지원하여 멀티코어 환경에서 성능을 향상시킬 수 있습니다. (쉽게 말해 여러 스레드가 데이터를 병렬로 처리하여 작업을 빠르게 완료)
지연 연산 예시
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class LazyEvaluationExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("John", "Jane", "Tom", "Diana", "Mike");
Stream<String> stream = names.stream()
.filter(name -> {
System.out.println("Filtering: " + name);
return name.startsWith("J");
})
.map(name -> {
System.out.println("Mapping: " + name);
return name.toUpperCase();
});
// 지연 연산이므로 최종 연산을 실행하기 전까지 위의 연산들이 실행되지 않음.
System.out.println("Before terminal operation");
// 최종 연산이 호출되는 시점에 필터링과 매핑이 수행됨.
stream.forEach(System.out::println);
}
}
병렬 처리 예시
import java.util.Arrays;
import java.util.List;
public class ParallelStreamExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("John", "Jane", "Tom", "Diana", "Mike");
// 병렬 스트림으로 변환
names.parallelStream()
.filter(name -> {
System.out.println("Filtering: " + name + " - " + Thread.currentThread().getName());
return name.startsWith("J");
})
.map(name -> {
System.out.println("Mapping: " + name + " - " + Thread.currentThread().getName());
return name.toUpperCase();
})
.forEach(name -> {
System.out.println("Final result: " + name + " - " + Thread.currentThread().getName());
});
}
}
스트림 API의 주요 메서드
-
중간 연산: 다른 스트림을 반환하며, 연속적으로 연결할 수 있는 연산들입니다.
-
filter()
: 조건에 맞는 요소만을 필터링합니다. -
map()
: 요소를 변환합니다. -
sorted()
: 요소를 정렬합니다.
-
-
최종 연산: 스트림을 소비하여 결과를 반환하는 연산들입니다.
-
forEach()
: 모든 요소에 대해 작업을 수행합니다. -
collect()
: 스트림의 결과를 컬렉션으로 반환합니다. -
reduce()
: 스트림의 요소를 하나로 결합합니다.
-
import java.util.Arrays;
import java.util.List;
public class StreamExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("John", "Jane", "Tom", "Anna");
// 'J'로 시작하는 이름을 필터링하고, 대문자로 변환 후 출력
names.stream()
.filter(name -> name.startsWith("J"))
.map(String::toUpperCase)
.forEach(System.out::println); // 출력 결과: JOHN, JANE
}
}
스트림의 장점
-
간결성: 람다식과 결합해 코드가 간결하고 읽기 쉬워집니다.
-
유연성: 필터링, 변환, 집계 등 다양한 연산을 자유롭게 조합할 수 있습니다.
-
병렬 처리: 데이터 처리 속도를 크게 향상시킬 수 있습니다.
스트림 API는 데이터를 처리하는 방식을 간단하게 만들고 성능 최적화까지 할 수 있습니다.