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);
}
}
스트림 처리 순서
- 스트림 만들기
- 중간 연산 : 연산 결과가 스트림, 연속해서 중간 연산 가능
- 최종 연산 : 연산 결과가 스트림이 아닌 연산, 스트림의 요소를 소모하므로 단 한 번만 가능
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://velog.io/@gmtmoney2357/자바-스트림Stream
자바의 정석 Chapter 14 람다와 스트림
https://ict-nroo.tistory.com/43
https://dororongju.tistory.com/137
'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 |