🔥 Vamos/Java

1116 | 자바의 정석 기초편 :: ch14-15~14-16 (스트림)

unikue 2022. 11. 16. 12:18

스트림

: 스트림 = 데이터의 연속적인 흐름

: 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것

(* 컬렉션, 배열 같이 여러 데이터를 저장하고 있는 것들=데이터소스)

(* 표준화된 방법 : 컬렉션 프레임웍으로 완벽하게 구현하진 못함 (list,set,map 각자 다 방법이 다름) 👉 스트림이 나오면서 정말로 통일됨

 

: 컬렉션이나 배열 같은 다양한 데이터소스 ▶ 스트림 생성 가능 ▶ 그 이후로는 작업 방식이 똑같아짐 ( 원랜 이 작업 과정이 각자 다 달랐음)

컬렉션에 정의된 스트림 메서드는 스트림을 반환. 이를 가지고 스트림을 만들 수 있음

 

 

 

✔ 스트림을 이용한 작업 순서 (스트림이 제공하는 기능- 중간연산과 최종연산)

1. 스트림 만들기

2. 중간연산 (0~n번)

3. 최종연산 (1번)

4. 결과값 얻음

stream.distinc(중복제거). limit(5개 자르기).sorted(정렬).forEach(스트림의 요소를 하나씩 꺼내서 출력)

 

 

 

스트림의 특징

1. 스트림은 데이터소스로부터 데이터를 읽기만 할 뿐 변경하지 않는다 (read only)

스트림으로 작업한 후에도 원본은 그대로

 

2. 스트림은 Iterator처럼 일회용(필요하면 다시 스트림을 생성해야함)

forEach()로 최종연산을 하고 나면 스트림이 닫혀서 streamclosed에러가 발생함

 

3. 최종연산 전까지 중간연산이 수행되지 않음 - 지연된 연산

중간연산 메서드가 메서드 호출시 바로 되는게 아니라 체크만 해놓는 것. (= 지연된 연산)

 

4. 작업을 내부반복으로 처리 - 내부반복

왼쪽의 str for문을 메서드 안으로 넣어서 forEach로 처리

 

5. 작업을 병렬로 처리 - 병렬스트림

: 멀티스레드로 병렬처리함

: 함수형언어 (FP)의 특징은 빅데이터를 처리하는 것 . ▶ 멀티스레드가 나눠서 처리하는게 효율적 ▶ 병렬스트림 기능 제공

스트림을 병렬스트림으로 변환 (반대변환은 Sequential())

 

 

✔ 기본형 스트림 (IntStream, DoubleStream, LongStream) 👉 효율적 작업 추구

: 오토박싱 & 언박싱 비효율 제거 (Stream <Integer> 대신 intStream사용)

👉 지네릭 Stream<T>에는 기본형이 불가하고 참조형만 가능하므로 오토박싱을 통해 기본형 ▶ 참조형으로 변환됨

데이터소스가 기본형일 때 , 빅데이터는 오토박싱/언박싱 변환시간이 많이 소요되므로 기본형 스트림 사용

 

: 숫자와 관련된 유용한 메서드를 Stream <T>보다 더 많이 제공

👉 Stream<T>는 들어오는게 뭔지 모르므로 count정도만 갖고있는데 intStream은 숫자인걸 알고 있어서 sum,average등 다른 메소드 제공.