Java Stream API는 Java 8에서 도입된 기능으로, 컬렉션 데이터의 조작을 보다 간결하고 효율적으로 할 수 있도록 해준다. 스트림은 컬렉션의 요소를 하나씩 처리할 수 있는 연속된 데이터 흐름을 나타내며, 이를 통해 데이터를 필터링, 변환, 집계 등의 작업을 선언형으로 처리할 수 있다.
주요 개념과 구성 요소
1. 스트림 생성 (Stream Creation)
- 컬렉션, 배열 또는 I/O 채널에서 스트림을 생성할 수 있다.
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
2. 중간 연산 (Intermediate Operations)
- 중간 연산은 스트림을 변환하고 또 다른 스트림을 반환한다. 중간 연산은 게으르게 평가(lazy evaluation)되며, 최종 연산이 호출되기 전까지 실행되지 않는다.
- 주요 중간 연산
- filter: 주어진 조건에 맞는 요소만 통과시킨다.
- map: 요소를 변환한다.
- flatMap: 스트림의 각 요소를 다른 스트림으로 대체한 후 모든 스트림을 하나의 스트림으로 병합한다.
- distinct: 중복 요소를 제거한다.
- sorted: 요소를 정렬한다.
- limit: 요소의 개수를 제한한다.
- skip: 처음 몇 개의 요소를 건너뛴다.
Stream<String> filteredStream = stream.filter(s -> s.startsWith("a"));
Stream<String> upperCaseStream = filteredStream.map(String::toUpperCase);
3. 최종 연산 (Terminal Operations)
- 최종 연산은 스트림을 소비하여 결과를 반환한다. 최종 연산을 호출하면 스트림은 더 이상 사용될 수 없다.
- 주요 최종 연산
- forEach: 각 요소에 대해 작업을 수행한다.
- collect: 스트림의 요소를 컬렉션으로 수집한다.
- reduce: 스트림의 요소를 하나의 값으로 결합한다.
- count: 요소의 개수를 반환한다.
- anyMatch, allMatch, noneMatch: 조건에 대한 요소의 일치 여부를 검사한다.
- findFirst, findAny: 스트림에서 첫 번째 요소 또는 임의의 요소를 반환한다.
List<String> collected = upperCaseStream.collect(Collectors.toList());
4. 병렬 스트림 (Parallel Streams)
- 스트림은 병렬로 처리될 수 있으며, 이는 멀티코어 프로세서를 활용하여 성능을 향상시킬 수 있다. 병렬 스트림은 내부적으로 작업을 분할하고 멀티스레딩을 통해 병렬로 실행된다.
List<String> list = Arrays.asList("a", "b", "c", "d");
list.parallelStream().forEach(System.out::println);
예제
1. 필터링 및 매핑 예제
List<String> myList = Arrays.asList("apple", "banana", "cherry", "date");
List<String> result = myList.stream()
.filter(s -> s.startsWith("a"))
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(result); // [APPLE]
2. reduce를 사용한 합계 계산
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, Integer::sum);
System.out.println(sum); // 15
3. flatMap을 사용한 스트림 평탄화
List<List<String>> listOfLists = Arrays.asList(
Arrays.asList("a", "b", "c"),
Arrays.asList("d", "e"),
Arrays.asList("f", "g", "h")
);
List<String> flatList = listOfLists.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
System.out.println(flatList); // [a, b, c, d, e, f, g, h]
Java Stream API는 복잡한 데이터 처리 작업을 간결하고 직관적으로 작성할 수 있게 해준다. 스트림의 기능을 통해 많은 코드 양을 줄일 수 있으며, 가독성을 높일 수 있다.
[참고] https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/package-summary.html Java SE 17 Stream 공식문서
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
예외 처리 (0) | 2024.02.05 |
---|---|
Static / Non-Static method (0) | 2024.01.29 |
Enum - 1 (feat. final) (0) | 2023.11.08 |
Optional (0) | 2023.08.23 |
Interface (0) | 2023.08.16 |