[Java]스트림(stram)

Junseo Jung·2023년 9월 20일

스트림

: 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 값 요소

컬렉션과 비슷하게 요소 형식으로 이루어진 연속된 값이다.

스트림 vs. 컬렉션

  • 컬렉션: 데이터를 어떻게 저장할 것인가. 자료구조에 초점
    • 적극적 생성: 자료구조가 포함하는 모든 값을 메서드에 포함
  • 스트림: 어떻게 계산할 것인가. 연산으로 이루어짐
    • 게으른 생성: 요청할 때만 요소를 계산

스트림의 장점

  1. How 중심의 코드에서 What 중심의 코드
  • 기존의 연봉 1억 이상의 평균연봉 코드
    int sum = 0;
    int count = 0;
    for (Employee emp : emps) {
        if (emp.getSalary() > 100_000_000) {
            sum += emp.getSalary();
            count++;
        }
    }
    
    double average = (double) sum / count;
    • 불필요한 sum , count등을 사용하여 어떻게 얻는 과정을 보인다.
  • 스트림을 사용한 코드
    double average = emps.stream()
                        .filter(emp -> emp.getSalary() > 100_000_000)
                        .mapToInt(Employee::getSalary)
                        .average()
                        .orElse(0);
    • 원하는 average만 사용하여 원하는 것만을 사용할 수있다.
  1. 불필요한 연산 줄임

    쇼트 서킷: 여러개의 조건이 중첩된 경우 값이 결정나면 불필요한 연산은 진행하지 않고 조건문을 나와 실행속도를 높인다.

  • 자료구조가 포함하는 모든 값을 메소드에 포함하는 컬렉션과 다르게 스트림은 요청할 때만 요소를 계산하는 고정된 자료구조를 가진다.

스트림의 구조

  1. 스트림 생성(강을 만들어)

    stream()
  2. 중간 연산(할일을 해)

    filter(), map()
  3. 최종 연산(이제 강에서 모아)

    collect()
  • 파이프라이닝
    - 연산의 해당 부분을 .으로 이어 사용함
    파이프라이닝

  • flatMap의 예시

    animal = ["cat","dog"]results = [ "c", "a", "t", "d", "o", "g" ]로 바꾸고 싶은 경우

    List<String> results = animals.stream().map(animal -> animal.split(""))
            .flatMap(Arrays::stream)
            .collect(Collectors.toList());
    1. 스트림을 통해 각 요소(”cat”, “dog”)에 대해 split(””)실행

      [ [ "c", "a", "t" ] , [ "d", "o", "g" ] ]

    2. 이렇게 얻은 결과를 flatMap을 통해 1차원으로 변경

    3. collect를 통해 결과 모으기

참고

[10분 테코톡] 🍡 춘식의 Stream

[Java] Stream API - map과 flatMap의 차이 및 활용법

0개의 댓글