JAVA : Stream 개념

JAVA의 스트림 Stream

  • 수많은 데이터의 흐름 속에서 각각의 원하는 값을 가공하여 최종 소비자에게 제공

- 바다에서 그물로 물고기만 걸러서 잡기 → filter : 중간 연산자
- 일정한 기준으로 상자에 물고기를 넣기 → map : 중간 연산자
- 물고기가 담긴 상자를 운반하여 트럭에 전달 → collect : 최종 연산자

 

 

필요성

  • For문 또는 Iterator를 통해 컬렉션이나 배열 데이터를 처리하는 코드는 길고 알아보기 어렵다.
  • List, Set, Map 등 다양한 데이터 소스(컬렉션, 배열 등)의 사용 방식이 달라 재사용성이 떨어진다. → 표준화된 방법 필요

👉🏻 이러한 문제점을 해결할 수 있는 Stream이 등장!! (Java8부터 지원)

 

 

특징

  • 데이터 컬렉션 반복을 멋지게 처리 → 컬렉션(배열 포함)의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자
  • 스트림은 데이터 소스를 변경❌
  • 스트림은 일회용 → 사용 후 닫히기 때문에 필요하면 다시 생성
  • 내부 반복으로 작업 처리
    • 내부 반복 : 반복문을 메소드 내부에 숨기기
//forEach()는 스트림에 정의된 메서드 중 하나로 매개변수에 대입된 람다식을 데이터 소스의 모든 요소에 적용
void forEach(Consumer<? super T> action) {
    Objects.requireNonNull (action);        // 매개변수 null 체크
    for(T t : src) {                        // 내부 반복
        action.accept(T);
    }
}

 

 

스트림 처리 순서

  1. 스트림 만들기
  2. 중간 연산 : 연산 결과가 스트림, 연속해서 중간 연산 가능
  3. 최종 연산 : 연산 결과가 스트림이 아닌 연산, 스트림의 요소를 소모하므로 단 한 번만 가능
list.stream() //스트림 만들기
    .filter() //중간연산
    .map()    //중간연산
    .forEach(System.out::println) //최종연산

 

 

스트림 종류

  • 자바8부터 java.util.stream 패키지에서 제공
  • Stream : 기본 타입 T
  • IntStream
  • LongStream
  • DoubleStream

👉🏻 오토 박싱&언박싱으로 인한 비효율을 줄이기 위해 데이터 소스의 요소를 기본형으로 다루는 스트림 제공

👉🏻 Stream <Integer> 대신 IntStream이 더 효율적

 

 

스트림 연산 특징

  • 지연 연산 Lazy Evaluatioin
    • 중간 연산을 바로 수행하지 않고 최종 연산까지 확인하고 수행함
    • 불필요한 연산을 피할 수 있음
// list = [1,2,3,4]
list.stream()
        .filter(i -> i<10) // 연산1
        .filter(i -> i%2==0) // 연산2
        .map(i -> i*2) // 연산3
        .findFirst()
        .get();

// list의 모든 요소에 대해 작업1을 마치고 작업2로 넘어가는 것이 아님
// 요소마다 작업1 > 작업2 > 작업3을 순차적으로 진행 
// 두 번째 요소 2로 답을 구하면, 3번쩨 요소와 4번째 요소는 연산1,2,3을 진행하지 않음!
  • 병렬 처리가 쉬움
    • 병렬처리 : 한 작업에서 나눈 서브 작업들을 분리된 스레드에서 병렬적으로 처리 후, 서브 작업의 결과들을 최종 결합하는 방법
    • 자바의 경우, fork&join프레임웍으로 병렬 처리
    • 병렬 처리를 위한 메소드 : parallel()
    • parallel() 호출 후, 취소할 때 사용하는 메소드 : sequential()
int sum = strStream.parallel().mapToInt(s -> s.length()).sum();

 

 

참조

https://steady-coding.tistory.com/309

https://youtu.be/wsvhgrCGW78

https://velog.io/@gmtmoney2357/자바-스트림Stream

자바의 정석 Chapter 14 람다와 스트림

https://ict-nroo.tistory.com/43

https://dororongju.tistory.com/137

https://girawhale.tistory.com/131

https://sas-study.tistory.com/461

'JAVA' 카테고리의 다른 글

JAVA 버전 변경하기 : ver.8 > ver.11 for MAC  (0) 2022.03.26
MAC M1 JAVA 설치  (0) 2022.02.25
Java 정규식 (Regular Expression)  (0) 2022.01.11
StringTokenizer vs split  (0) 2021.07.27
JAVA 설치하기 (for window)  (0) 2021.07.23