IT 개발 라이프/Back_End

자바 Stream 이란? 🚀

10Biliion 2024. 12. 4. 14:16

자바 8에서 도입된 Stream API는 데이터를 처리하는 강력한 도구입니다. Stream은 데이터를 필터링, 매핑, 정렬, 집계 등의 작업을 선언적으로 처리할 수 있도록 해줍니다. 이번 글에서는 Stream의 기본 개념부터 다양한 예제와 함께 실습해보겠습니다! ✨


1. Stream이란? 🤔

Stream은 데이터의 흐름을 추상화한 개념으로, 컬렉션 또는 배열의 데이터를 함수형 스타일로 처리할 수 있게 해줍니다.

Stream의 특징

  1. 선언형 프로그래밍: 무엇을 할지에 집중하며, 어떻게 할지는 신경 쓰지 않습니다.
  2. 중간 연산과 최종 연산: 데이터를 처리하는 두 가지 방식이 있습니다.
    • 중간 연산: 결과를 반환하며, 다른 연산과 연결 가능합니다. (예: filter, map)
    • 최종 연산: Stream을 닫고 결과를 반환합니다. (예: forEach, collect)
  3. 데이터를 변경하지 않음: 원본 데이터를 변경하지 않고 새로운 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을 활용하면 효율성과 가독성을 동시에 얻을 수 있습니다.💪