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