Stream API와 람다를 통한 병렬 처리

Soobin Kim·2024년 4월 6일

Java

목록 보기
43/47

Java의 Stream API

Java 8에 도입된 기능으로 데이터의 흐름을 다루기 위한 선언형 API다.
스트림을 사용하여 필터링, 매핑, 정렬 등 다양한 데이터 처리 작업을 적용할 수 있으며 최종 결과를 배열이나 컬렉션으로 변환할 수 있다.
스트림은 데이터 처리 작업을 연속적인 파이프라인으로 나타낼 수 있어 가독성이 높고 병렬 처리를 쉽게 구현할 수 있다.

Stream의 연산

  • Java의 Stream은 중간 연산과 최종 연산을 가진다. 중간 연산은 스트림을 처리하고 다른 스트림을 반환하는 반면 최종 연산은 스트림을 처리하고 결과를 반환한다.

배열을 스트림으로 변환

배열을 스트림으로 변환한다는 것은 배열의 원소들을 스트림 형태로 변환하여 처리할 수 있게 하는 것이다. 스트림은 원본 데이터를 변경하지 않고 필요한 데이터 처리 작업을 적용한 결과를 생성하기 때문에 인덱스를 통한 직접 접근은 제공하지 않는다.

  • stream() 배열을 스트림으로 변환
        int[] numbers = {1,2,3,4,5};
        IntStream stream = Arrays.stream(numbers);
  • filter() 스트림을 통해 필터링 작업 및 데이터 처리 작업
        IntStream evenStream = stream.filter(n->n%2==0); // 중간 연산, 람다식 사용
        int evenSum = evenStream.sum();					// 최종 연산
        // ==> int evenSum = stream.filter(n->n%2==0).sum();
        
        System.out.println(evenSum);
  • toArray() 스트림을 배열로 변환
        int[] numbers = {1,2,3,4,5};
        IntStream stream = Arrays.stream(numbers);

        IntStream evenStream = stream.filter(n->n%2==0);
        // [2, 4]
        System.out.println(Arrays.toString(evenStream.toArray()));

다른 예시

  • 짝수 요소를 제곱하고 그 합을 구함
  interface FilterEven{
      boolean isEven(int n);
  }

  public class ArrayStreamEx {
      public static boolean isEvenStatic(int n){
          return n % 2 == 0;
      }
      public static void main(String[] args) {
          List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

          // 객체 n의 조건자 boolean값을 반환하는 함수형 인터페이스
          Predicate<Integer> isEven = n -> n%2 == 0;
          FilterEven fe = n -> n%2 == 0;

          int sumOfsquares = numbers.stream()
                  .filter(isEven) // 짝수 스트림 필터
  //              .filter(fe::isEven) 같은 표현
  //              .filter(ArrayStreamEx::isEvenStatic) 같은 표현
                  .sorted()       // 스트림 정렬
                  .map(n->n*n)    // 모든 원소를 제곱함
                  .reduce(0, Integer::sum); // 초기값 0에 원소들을 순차적으로 더함(누적합)
          System.out.println("짝수 제곱의 합: "+sumOfsquares);
      }
  }
  • 대문자로 변환
  List<String> words = Arrays.asList("apple", "banana", "cherry", "orange");

  List<String> uppercaseWords = words.stream()
          .map(n -> n.toUpperCase())
          .collect(Collectors.toList());
          
  // 대문자로 변환한 리스트: [APPLE, BANANA, CHERRY, ORANGE]
  System.out.println("대문자로 변환한 리스트: "+uppercaseWords.toString());

0개의 댓글