BEER&DEV

자바의 Stream 2 - 초보자를 위한 꼬리의 꼬리를 무는 자바 본문

BASIS/JAVA

자바의 Stream 2 - 초보자를 위한 꼬리의 꼬리를 무는 자바

사당맥주 2023. 7. 17. 12:29
반응형

Stream의 다양한 활용을 보여주는 10가지 예시입니다.

1. 요소 필터링: 짝수만 필터링하여 새로운 리스트 생성하기

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = numbers.stream()
                                   .filter(number -> number % 2 == 0)
                                   .collect(Collectors.toList());



2. 매핑: 문자열 리스트에서 각 요소의 길이를 추출하여 새로운 리스트 생성하기

List<String> words = Arrays.asList("Apple", "Banana", "Cherry");
List<Integer> wordLengths = words.stream()
                                 .map(String::length)
                                 .collect(Collectors.toList());



3. 정렬: 숫자 리스트를 오름차순으로 정렬하기

List<Integer> numbers = Arrays.asList(5, 3, 9, 1, 2);
List<Integer> sortedNumbers = numbers.stream()
                                     .sorted()
                                     .collect(Collectors.toList());



4. 최댓값 및 최솟값: 숫자 리스트에서 최댓값과 최솟값 찾기

List<Integer> numbers = Arrays.asList(5, 3, 9, 1, 2);
Optional<Integer> maxNumber = numbers.stream()
                                     .max(Integer::compareTo);
Optional<Integer> minNumber = numbers.stream()
                                     .min(Integer::compareTo);



5. 중복 제거: 문자열 리스트에서 중복을 제거한 리스트 생성하기

List<String> words = Arrays.asList("Apple", "Banana", "Cherry", "Apple", "Cherry");
List<String> distinctWords = words.stream()
                                 .distinct()
                                 .collect(Collectors.toList());



6. 플래트맵: 중첩된 리스트를 하나의 리스트로 펼치기

List<List<Integer>> nestedLists = Arrays.asList(
    Arrays.asList(1, 2, 3),
    Arrays.asList(4, 5, 6),
    Arrays.asList(7, 8, 9)
);
List<Integer> flattenedList = nestedLists.stream()
                                         .flatMap(Collection::stream)
                                         .collect(Collectors.toList());



7. 첫 번째 요소 반환: 숫자 리스트에서 첫 번째 요소 찾기

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> firstNumber = numbers.stream()
                                       .findFirst();



8. 스킵: 숫자 리스트에서 처음 3개의 요소를 제외한 나머지 요소 반환하기

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> skippedNumbers = numbers.stream()
                                      .skip(3)
                                      .collect(Collectors.toList());



9. 요소 개수 세기: 문자열 리스트에서 길이가 5 이상인 요소의 개수 세기

List<String> words = Arrays.asList("Apple", "Banana", "Cherry", "Apricot", "Blueberry");
long count = words.stream()
                  .filter(word -> word.length() >= 5)
                  .count();



10. 통계 정보 계산: 숫자 리스트의 합계, 평균, 최댓값, 최솟값 계산하기

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
IntSummaryStatistics stats = numbers.stream()
                                    .mapToInt(Integer::intValue)
                                    .summaryStatistics();

int sum = stats.getSum();
double average = stats.getAverage();
int max = stats.getMax();
int min = stats.getMin();


위 예시에서 보여주듯, 자바에서 Stream을 사용하는 이유는 다음과 같습니다:

1. 간결하고 가독성 좋은 코드

Stream은 함수형 프로그래밍의 개념을 도입하여 코드를 더 간결하고 가독성 좋게 작성할 수 있도록 도와줍니다. 반복문과 비교하여 선언적인 방식으로 데이터 처리 작업을 표현할 수 있어 코드의 목적을 더 명확하게 전달할 수 있습니다.

2. 내부 반복

Stream은 내부적으로 반복을 처리하므로 개발자가 명시적으로 요소에 접근하고 조작할 필요가 없습니다. 반복문에서 요소에 대한 반복을 개발자가 직접 작성하는 것과 달리, Stream은 데이터 처리를 자동으로 처리하며, 이를 통해 코드를 더 간결하게 작성할 수 있습니다.

3. 지연 평가

Stream은 중간 연산과 최종 연산으로 구성된 파이프라인을 생성합니다. 중간 연산은 데이터를 변환하거나 필터링하는 작업이며, 최종 연산은 결과를 생성하거나 수집하는 작업입니다. 이러한 연산들은 지연 평가 방식을 사용하여 최종 연산이 호출될 때까지 실제로 실행되지 않습니다. 이는 데이터 처리 작업의 효율성을 높이고, 필요한 데이터만 처리함으로써 성능을 향상시킬 수 있습니다.

4. 병렬 처리 지원

Stream은 병렬 처리를 지원합니다. 데이터를 병렬적으로 처리하려면 `parallelStream()` 메서드를 사용하여 병렬 스트림을 생성할 수 있습니다. 이는 멀티코어 환경에서 데이터 처리 속도를 향상시킬 수 있는 장점을 제공합니다.

마치며..

Stream은 이러한 이유로 자바에서 데이터 처리 작업을 보다 간결하고 효율적으로 처리할 수 있는 도구로 널리 사용되고 있습니다. 코드의 가독성과 유지보수성을 향상시키면서, 성능을 개선할 수 있는 Stream의 사용은 모던 자바 개발에 매우 유용합니다.

반응형