JAVA8 스트림 API 소개: 현대적인 데이터 처리 방법

JAVA
JAVA

자바 8에 도입된 스트림 API는 데이터 컬렉션을 함수형 스타일로 처리할 수 있는 강력한 도구입니다. 이는 기존의 명령형 프로그래밍 방식 대신 선언적으로 데이터를 다룰 수 있게 해 주어, 코드의 가독성과 유지보수성을 크게 향상합니다. 스트림 API를 사용하면, 컬렉션을 데이터베이스 쿼리처럼 다룰 수 있으며, 이는 복잡한 데이터 처리 작업을 간결하고 직관적인 코드로 변환할 수 있게 해 줍니다.

List<String> names = Arrays.asList("Park", "Choi", "Kim", "Lee");
List<String> filteredNames = names.stream()
                                   .filter(name -> name.startsWith("P"))
                                   .collect(Collectors.toList());
System.out.println(filteredNames); // 출력: [Park]

 

 

스트림 API의 핵심 연산

스트림 API는 '중간 연산'과 '최종 연산'으로 구성됩니다.

 

중간 연산은 스트림을 변환하는 연산으로, 여러 연산을 체이닝 할 수 있으며, filter, map, sorted 등이 있습니다.

최종 연산은 스트림을 소비하여 결과를 도출하며, forEach, collect, reduce 등이 있습니다.

 

중간 연산은 지연 실행되며, 최종 연산이 호출될 때 모든 연산이 수행됩니다. 이러한 특성은 불필요한 계산을 줄이고 성능을 최적화하는 데 도움을 줍니다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
int sum = numbers.stream()
                 .filter(n -> n % 2 == 0)
                 .mapToInt(n -> n * n)
                 .sum();
System.out.println(sum); // 출력: 56 (2의 제곱 + 4의 제곱 + 6의 제곱)

 

 

스트림 API를 활용한 데이터 처리 사례

스트림 API는 다양한 데이터 처리 작업을 간편하게 만듭니다. 예를 들어, 리스트에서 조건을 만족하는 요소를 필터링하고, 그 결과를 새로운 리스트로 수집하는 작업은 스트림 API를 사용하여 몇 줄의 코드로 간단히 해결할 수 있습니다. 또한, 스트림 API는 병렬 처리를 내장 지원하여, 대용량 데이터 처리 시 성능을 크게 향상할 수 있습니다.

 
List<String> transactions = Arrays.asList("w55ng", "woong", "w55ng", "w55ng", "woong");
long w55ngCount = transactions.stream()
                              .filter(transaction -> transaction.equals("w55ng"))
                              .count();
System.out.println(w55ngCount); // 출력: 3

 

스트림 API의 고급 활용

스트림 API는 Collectors 클래스를 통해 데이터를 그룹화하고, 요약하는 고급 연산을 제공합니다. 예를 들어, 학생 객체의 리스트를 학년별로 그룹화하고, 각 그룹의 평균 점수를 계산하는 작업은 groupingBy와 averagingInt 컬렉터를 사용하여 간단히 구현할 수 있습니다. 이러한 고급 기능은 복잡한 데이터 처리 요구사항을 효과적으로 해결할 수 있게 해 줍니다.

 
List<Student> students = Arrays.asList(
    new Student("Kim", 10, 3), // Student : (name, score, grade)
    new Student("Lee", 12, 2),
    new Student("Park", 15, 3),
    new Student("Choi", 9, 2)
);

Map<Integer, Double> averageScoresByGrade = students.stream()
                                                     .collect(Collectors.groupingBy(Student::getGrade, Collectors.averagingInt(Student::getScore)));
System.out.println(averageScoresByGrade); // 출력 예시: {2=10.5, 3=12.5}

 

이러한 예시들은 자바 스트림 API의 다양한 기능과 이를 활용한 데이터 처리 방법을 보여줍니다. 스트림 API는 복잡한 데이터 처리 로직을 간결하고 가독성 높은 코드로 변환할 수 있게 해 주며, 이는 자바 개발자에게 매우 유용한 도구입니다.