Java 8 Stream API 주요 메서드와 사용 예제
Java 8 Stream API란?
Java 8에서 도입된 Stream API는 데이터 컬렉션(예: List, Set, Map)을 보다 쉽고 효율적으로 처리할 수 있도록 설계된 기능입니다.
함수형 프로그래밍 스타일을 지원하며, 데이터를 필터링, 변환, 정렬, 집계하는 작업을 간결하게 표현할 수 있습니다. 이 글에서는 Stream API의 주요 메서드와 그 활용법을 예제를 통해 알아봅니다.
Stream API의 주요 특징
- 함수형 프로그래밍 지원: 반복문 없이 선언형 코드 작성 가능.
- 체이닝 가능: 데이터 처리 과정을 간결하게 연결.
- 지연 연산: 최종 연산이 호출될 때만 실행.
- 병렬 처리 지원: 대용량 데이터 처리 시 성능 최적화 가능.
Stream API의 주요 메서드와 예제
Java 8 Stream API는 데이터를 효율적으로 처리할 수 있는 다양한 메서드를 제공합니다. 아래에서 주요 메서드와 실용적인 예제를 확인하세요.
1. filter
filter()
는 스트림의 각 요소를 주어진 조건에 맞게 선택하는 메서드입니다. 이 메서드는 조건을 만족하는 요소들만 남기고, 나머지는 필터링합니다. 주로 조건에 맞는 요소를 추출할 때 사용됩니다.
- 매개변수:
Predicate<T> condition
– 각 요소에 대해 테스트할 조건을 정의하는Predicate
인터페이스를 받습니다. - 반환값: 필터링된 새로운 스트림을 반환합니다.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream()
.filter(name -> name.length() == 4) // 이름 길이가 4인 경우만 필터링
.toList();
System.out.println(filteredNames); // 출력: [Bob]
2. map
map()
은 스트림의 각 요소를 다른 형태로 변환하는 데 사용됩니다. 보통 각 요소에 대해 변환 작업을 수행하여 새로운 데이터로 매핑할 때 유용합니다. 스트림의 각 요소를 변환하여 새로운 스트림을 만듭니다.
- 매개변수:
Function<T, R> mapper
– 각 요소를 변환할 함수를 받습니다. - 반환값: 변환된 새로운 스트림을 반환합니다.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> upperCaseNames = names.stream()
.map(String::toUpperCase) // 각 이름을 대문자로 변환
.toList();
System.out.println(upperCaseNames); // 출력: [ALICE, BOB, CHARLIE]
3. sorted
sorted()
는 스트림의 요소들을 정렬하는 메서드입니다. 기본적으로 오름차순으로 정렬하지만, Comparator
를 제공하여 내림차순 정렬이나 커스텀 정렬을 할 수 있습니다.
- 매개변수:
Comparator<T> comparator
(옵션) – 요소를 비교하는 기준을 정의하는Comparator
를 전달할 수 있습니다. - 반환값: 정렬된 새로운 스트림을 반환합니다.
List<Integer> numbers = Arrays.asList(5, 3, 8, 1, 2);
List<Integer> sortedNumbers = numbers.stream()
.sorted() // 기본 오름차순 정렬
.toList();
System.out.println(sortedNumbers); // 출력: [1, 2, 3, 5, 8]
4. collect
collect()
는 스트림의 요소를 다양한 형태의 컬렉션으로 수집하는 메서드입니다. 주로 결과를 리스트, 셋, 맵 등의 형태로 모을 때 사용합니다. Collectors
유틸리티 클래스와 함께 사용하면 편리합니다.
Collectors.toList()
, Collectors.toSet()
과 같은 유틸리티 메서드를 자주 사용합니다.
- 매개변수:
Collector<T, A, R> collector
– 수집 작업을 정의하는Collector
를 받습니다. - 반환값: 수집된 결과를 반환합니다.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Alice");
Set<String> uniqueNames = names.stream()
.collect(Collectors.toSet()); // 중복 제거 후 Set으로 수집
System.out.println(uniqueNames); // 출력: [Alice, Bob, Charlie]
5. reduce
reduce()
는 스트림의 요소들을 하나의 값으로 집계하는 메서드입니다. 주로 합계, 평균, 곱셈 등과 같이 집합적 연산을 수행할 때 사용됩니다.
- 매개변수:
BinaryOperator<T> accumulator
– 두 개의 요소를 결합하는 방식을 정의하는 함수를 받습니다. - 반환값: 집계된 결과 값을 반환합니다.
int[] numbers = {1, 2, 3, 4, 5};
int sum = Arrays.stream(numbers)
.reduce(0, Integer::sum); // 합계 계산
System.out.println("합계: " + sum); // 출력: 합계: 15
6. distinct
distinct()
는 스트림에서 중복된 요소를 제거하는 메서드입니다. 중복을 제거하고 고유한 값만 남기기 때문에 집합(Set)에서만 유효한 데이터를 필터링할 때 유용합니다.
- 매개변수: 없음.
- 반환값: 중복이 제거된 새로운 스트림을 반환합니다.
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 4, 5);
List<Integer> distinctNumbers = numbers.stream()
.distinct() // 중복 제거
.toList();
System.out.println(distinctNumbers); // 출력: [1, 2, 3, 4, 5]
7. anyMatch, allMatch, noneMatch
이 메서드들은 스트림의 요소들이 주어진 조건을 만족하는지 검사하는 메서드입니다.
- anyMatch(): 하나라도 조건을 만족하면 true 반환.
- allMatch(): 모든 요소가 조건을 만족하면 true 반환.
- noneMatch(): 모든 요소가 조건을 만족하지 않으면 true 반환.
int[] numbers = {2, 4, 6, 8, 10};
// 하나라도 홀수가 있으면 true 반환
boolean hasOdd = Arrays.stream(numbers)
.anyMatch(n -> n % 2 != 0);
System.out.println("홀수가 있나요? " + hasOdd); // 출력: false
// 모든 숫자가 짝수이면 true 반환
boolean allEven = Arrays.stream(numbers)
.allMatch(n -> n % 2 == 0);
System.out.println("모두 짝수인가요? " + allEven); // 출력: true
'개발 언어 > Java' 카테고리의 다른 글
Java 시간 클래스 차이 LocalDateTime OffsetDateTime (0) | 2024.11.14 |
---|---|
Java 리액티브 StepVerifier 설명 예제 (0) | 2024.02.20 |
Java 리액티브 Mono Flux 설명 예제 (0) | 2024.02.06 |
Java8 함수형 인터페이스 Function, Consumer, Predicate, Supplier (0) | 2023.11.15 |
Java8 Functional Interface 간단한 예제로 알아보기 (0) | 2023.06.04 |
댓글