Java ‐ 스트림은 주의해서 사용하라[Effective Java Item 45] - dnwls16071/Backend_Summary GitHub Wiki
스트림은 주의해서 사용하라
- 스트림 API는 다량의 데이터 처리 작업(순차적이든 병렬적이든)을 돕고자 자바 8에 추가된 내용이다.
- 스트림 API가 제공하는 추상 개념 중 핵심은 Stream과 Stream Pipeline이다.
- Stream : 데이터 원소의 유한 혹은 무한 시퀀스를 뜻한다.
- Stream Pipeline : 해당 원소들로 수행하는 연산 단계를 표현하는 개념이다.
- 스트림 안의 원소들은 참조형이나 기본형이다. 기본형 중에서 int, long, double 이렇게 3가지를 지원한다.
- 스트림 API는 메서드 연쇄를 지원하는 플루언트 API(Fluent API)이다.
- 즉, 파이프라인 하나를 구성하는 모든 호출을 연결하여 단 하나의 표현식으로 완성할 수 있다. 파이프라인 여러 개를 연결해 표현식 하나로 만들 수 있다.
- 기본적으로 스트림 파이프라인은 순차적으로 수행된다. 파이프라인을 병렬로 실행하려면 파이프라인을 구성하는 스트림 중 하나에서
parallel 메서드를 호출해주기만 하면 되지만 효과를 볼 수 있는 상황은 많지 않다.
지연 평가(lazy evaluation)
- 그 때마다 값을 평가하지 않고, 정말 결과값이 필요한 시점까지 평가를 미루는 것을 말한다.
- 필요할 때만 평가가 되기 때문에 메모리를 효율적으로 사용할 수 있다.
- 무한 자료구조를 만들 수 있다.
- 런타임 에러를 방지할 수 있다.(컴파일 시 에러 체크가 가능)
- 컴파일러 최적화 기능 제공
Stream 사용을 추천하는 경우
- 원소들의 시퀀스(순서)를 일관되게 변환해야되는 경우
- 원소들의 시퀀스를 필터링하는 경우
- 원소들의 시퀀스를 하나의 연산을 사용해 결합해야되는 경우
- 원소들의 시퀀스를 컬렉션에 모으는 경우
- 원소들의 시퀀스에서 특정 조건을 만족하는 원소를 찾는 경우
Stream API