자바 8에서 도입된 Stream API는 데이터를 처리하는 강력한 도구입니다. Stream은 데이터를 필터링, 매핑, 정렬, 집계 등의 작업을 선언적으로 처리할 수 있도록 해줍니다. 이번 글에서는 Stream의 기본 개념부터 다양한 예제와 함께 실습해보겠습니다! ✨
1. Stream이란? 🤔
Stream은 데이터의 흐름을 추상화한 개념으로, 컬렉션 또는 배열의 데이터를 함수형 스타일로 처리할 수 있게 해줍니다.
Stream의 특징
- 선언형 프로그래밍: 무엇을 할지에 집중하며, 어떻게 할지는 신경 쓰지 않습니다.
- 중간 연산과 최종 연산: 데이터를 처리하는 두 가지 방식이 있습니다.
- 중간 연산: 결과를 반환하며, 다른 연산과 연결 가능합니다. (예: filter, map)
- 최종 연산: Stream을 닫고 결과를 반환합니다. (예: forEach, collect)
- 데이터를 변경하지 않음: 원본 데이터를 변경하지 않고 새로운 Stream을 반환합니다.
2. Stream 생성하기 🌱
Stream은 다양한 방식으로 생성할 수 있습니다.
컬렉션에서 생성
List<String> list = Arrays.asList("apple", "banana", "cherry");
Stream<String> stream = list.stream();
배열에서 생성
String[] array = {"apple", "banana", "cherry"};
Stream<String> stream = Arrays.stream(array);
직접 생성
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
무한 스트림 생성
Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 2);
3. 주요 연산 🌟
3.1 필터링 (filter)
filter는 조건에 맞는 데이터만 걸러냅니다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers); // [2, 4]
3.2 매핑 (map)
map은 데이터를 변환하는 데 사용됩니다.
List<String> names = Arrays.asList("john", "jane", "doe");
List<String> upperCaseNames = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(upperCaseNames); // [JOHN, JANE, DOE]
3.3 정렬 (sorted)
sorted는 데이터를 정렬합니다.
List<String> fruits = Arrays.asList("banana", "apple", "cherry");
List<String> sortedFruits = fruits.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedFruits); // [apple, banana, cherry]
3.4 집계 (reduce)
reduce는 데이터를 하나의 값으로 줄입니다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, Integer::sum);
System.out.println(sum); // 15
4. 병렬 처리 🚀
Stream은 병렬 처리도 간단하게 지원합니다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.parallelStream()
.forEach(System.out::println);
⚠️ 주의: 병렬 처리는 순서가 보장되지 않으므로 순서가 중요한 작업에서는 사용하지 않는 것이 좋습니다.
5. 예제 프로젝트 🎯
예제: 문자열 길이 필터링
List<String> words = Arrays.asList("stream", "java", "filter", "example");
List<String> longWords = words.stream()
.filter(word -> word.length() > 5)
.collect(Collectors.toList());
System.out.println(longWords); // [stream, filter, example]
예제: 데이터 그룹화
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eve");
Map<Character, List<String>> groupedByInitial = names.stream()
.collect(Collectors.groupingBy(name -> name.charAt(0)));
System.out.println(groupedByInitial);
// {A=[Alice], B=[Bob], C=[Charlie], D=[David], E=[Eve]}
6. 마무리 🌈
Stream은 자바 프로그래밍을 더욱 간결하고 강력하게 만들어줍니다. 데이터를 다루는 작업에서 Stream을 활용하면 효율성과 가독성을 동시에 얻을 수 있습니다.💪
'IT 개발 라이프 > Back_End' 카테고리의 다른 글
자바(Java) Enum 이란? (0) | 2024.12.05 |
---|---|
JWT(JSON Web Token) (0) | 2024.12.05 |
자바에서 동적 바인딩과 정적 바인딩 이해하기 🐾✨ (0) | 2024.12.03 |
Feign Client란? 🤔 (0) | 2024.12.03 |
필드 주입과 생성자 주입 – 무엇이 더 나은 선택일까? 🌍 (1) | 2024.12.02 |