Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- javascript 기초
- 이펙티브 자바
- Spring
- javascript
- Redis
- you don't know js
- java.util.LinkedHashMap cannot be cast
- spring security
- 자바
- CAS
- ECMA2015
- javascript 값
- effectivejava
- 이펙티브자바
- Babel
- webstorm
- javascript type
- Intellij
- javascript value
- ES6
- 자바스크립트
- requestbody
- spring batch #스프링 배치 #스프링 배치 중복 실행
- webpack
- nodeJS
- Effective Java
- java
- JetBrains
- javascript native
- Spring Session
Archives
- Today
- Total
귀찮지만 만들어보자
이펙티브 자바 - 람다와 스트림(4) 본문
스트림은 주의해서 사용하라
스트림은 다량의 데이터 처리 작업을 돕고자 자바8에 추가되었다.
이 API에서 제공하는 추상 개념중 핵심은 두 가지다.
- 스트림은 데이터 원소의 유한 혹은 무한 시퀀스를 뜻한다
- 스트림 파이프라인은 이 원소들로 수행하는 연산 단계를 표현하는 개념이다
스트림의 파이프라인은 소스 스트림으로 시작해서 종단 연산으로 끝난다. 그 사이에 하나 이상의 중간 연산이 있을 수 있다.
여기서 중간 연산은 스트림이 어떠한 형태로 변환한다. 최종적인 연산의 결과는 종단 연산에서 처리하게 된다.
중간 연산이 여러개 존재할 경우에 종단연산에서 지연 평가된다. 사실은 이게 핵심이다! 잘 기억해두자
스트림 API는 메서드 연쇄를 지원하는 플루언트 API이다. 그니까 이어 붙이는게 가능하다.
위에서 굵은 글씨로 써놓은 내용을 구현할 수 있다는 말이다.
- 예시
Stream.of(1,2,3,4).filter(value -> value / 2 == 0).filter( value -> value < 3).count();
여기에서 filter가 중간 연산이고 count는 종단 연산이다.
filter를 하나로 사용할 수 있지만 중간 연산을 여러개 쓸수 있다는 것을 표현하기 위해 사용했다.
중간 연산에서 들어가 있는 내용을 최종적으로 count를 호출할때 보다 효율적으로 사용하는 것이다.
기본적으로 스트림 파이프라인은 순차적으로 수행된다.
파이프라인을 병렬로 실행하려면 pararell 메서드를 호출하면 되지만 효과를 보는 경우는 한정적이다. 뒤에서 다룸
스트림을 과용하지 마라
- 과용하면 프로그램이 오히려 읽거나 유지보수하기 어려워진다.
- 기존 코드는 스트림을 사용호도록 리팩토링 하되, 새 코드가 더 나아 보일 때만 반영하자.
- char용 스트림을 지원하지 않기 떄문에 char값들을 처리할 때는 스트림을 삼가는 편이 낫다
핵심은 스트림과 일반적인 반복문 중에 애매할 경우 둘 다 해보고 더 나은쪽을 택하라
* 여담으로 토비아저씨도 스트림의 오남용에 대해 경고한 바가 있다
참고해서 잘 쓰도록 하자..
'이펙티브 자바' 카테고리의 다른 글
이펙티브 자바 - 람다와 스트림(6) (0) | 2019.01.19 |
---|---|
이펙티브 자바 - 람다와 스트림(5) (0) | 2019.01.19 |
이펙티브 자바 - 람다와 스트림(3) (0) | 2019.01.13 |
이펙티브 자바 - 람다와 스트림(2) (0) | 2019.01.13 |
이펙티브 자바 - 람다와 스트림(1) (0) | 2018.12.29 |