Java Stream API는 Java 8에서 도입된 기능으로, 데이터 처리를 간결하고 효율적으로 할 수 있도록 설계되었습니다. Stream API는 대량의 데이터 처리, 병렬 작업, 필터링, 매핑 등의 기능을 제공하며, 코드의 가독성과 유지보수성을 크게 향상시킵니다. 이번 글에서는 Stream API의 심화 개념과 활용 사례를 살펴보겠습니다.
1. Stream API란?
Stream은 컬렉션 데이터를 처리하기 위한 연속된 요소들의 흐름을 나타냅니다. Stream API는 데이터를 처리하기 위한 선언적 방식을 제공하며, 데이터를 필터링하고, 변환하고, 수집할 수 있습니다.
Stream의 주요 특징:
Stream 생성 예:
import java.util.*;
import java.util.stream.*;
public class StreamExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream().forEach(System.out::println);
}
}
2. Stream API의 주요 연산
Stream API는 데이터를 처리하기 위한 두 가지 주요 연산을 제공합니다:
주요 중간 연산:
filter
: 조건에 따라 요소를 필터링합니다.map
: 요소를 변환합니다.sorted
: 요소를 정렬합니다.distinct
: 중복을 제거합니다.예:
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
주요 최종 연산:
collect
: 결과를 List, Set 등으로 수집합니다.forEach
: 각 요소를 처리합니다.reduce
: 요소를 하나의 값으로 결합합니다.count
: 요소의 개수를 반환합니다.예:
long count = names.stream()
.filter(name -> name.length() > 3)
.count();
System.out.println("이름의 길이가 3보다 큰 요소의 개수: " + count);
3. 고급 Stream API 기능
예:
List<List<String>> nestedList = Arrays.asList(
Arrays.asList("A", "B"),
Arrays.asList("C", "D")
);
List<String> flatList = nestedList.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
System.out.println(flatList); // [A, B, C, D]
예:
List<Integer> numbers = IntStream.range(1, 1000)
.boxed()
.collect(Collectors.toList());
long sum = numbers.parallelStream()
.reduce(0, Integer::sum);
System.out.println("병렬 처리 결과: " + sum);
예:
Map<Integer, List<String>> groupedByLength = names.stream()
.collect(Collectors.groupingBy(String::length));
System.out.println(groupedByLength);
예:
Collector<String, StringBuilder, String> customCollector = Collector.of(
StringBuilder::new,
StringBuilder::append,
StringBuilder::append,
StringBuilder::toString
);
String result = names.stream().collect(customCollector);
System.out.println(result);
4. Stream API 활용 사례
예:
List<String> emails = users.stream()
.filter(user -> user.getAge() > 18)
.map(User::getEmail)
.collect(Collectors.toList());
예:
double averageAge = users.stream()
.collect(Collectors.averagingInt(User::getAge));
System.out.println("평균 나이: " + averageAge);
예:
List<String> sortedNames = names.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedNames);
5. Stream API 사용 시 주의사항
결론
Stream API는 데이터를 선언적으로 처리할 수 있는 강력한 도구를 제공합니다. 중간 연산과 최종 연산을 조합하여 복잡한 데이터 처리 로직을 간결하고 효율적으로 작성할 수 있으며, 병렬 스트림을 활용하면 성능 최적화도 가능합니다. Stream API의 다양한 기능을 익혀 Java 애플리케이션에서 더욱 생산적인 코드를 작성해 보세요.
일상에서 벗어나 진정한 휴식을 꿈꾼다면, 일본 하코네 온천 료칸만큼 매력적인 여행지도 드물 것입니다. 하지만 검색만…
디즈니랜드 여행을 앞두고 가장 중요한 고민 중 하나는 바로 “숙소 선택”입니다. 꿈같은 하루를 선물하고 싶은…
스이카 카드 발급 해야하는 이유 "도쿄 지하철 정복은 스이카 카드 없으면 절대 불가능합니다!" "이 카드…
리버 크루즈를 타야만 하는 이유 "오사카 여행에서 낮에는 활기찬 거리, 밤에는 화려한 네온사인으로 물든 도시를…
오사카 여행에 필수적인 교통패스인 오사카 교통패스에 대해 소개 하겠습니다. 일본 오사카 여행을 준비 중이시라면, 효율적인…
후쿠오카는 일본 여행지 중에서도 근교 여행지와 맛집, 쇼핑, 자연 풍경, 도시를 한 번에 즐길 수…