[Java/자바] Stream API

Stream API란?

Java8의 새로운 기능인 java.util.stream 패키지는 함수형 연산 작업(Collections의 map, reduce, filter, .etc)을 지원하는 패키지이다.

Javascriptpython에서 많이 쓰는 것들이 Java에도 있다!

Stream과 Collections의 여러 가지 차이점

  1. Stream은 자료를 저장할 수 있는 data structure가 아니다.
    대신, 자료구조, 배열, I/O 채널 등으로부터 받아온 데이터를 연산 파이프라인을 통해 우리에게, 사용자에게 전달해준다.
  2. Stream의 연산의 결과는 결과 그 자체이고, 자료/데이터의 원천/원본(Source)을 변형하지 않는다.
  3. Laziness-seeking.
    프로그래밍 관점에서 Laziness란, 미리 준비되어 있는 것이 아니라 필요할 때 준비되는 것 정도라고 이해하면 될 것 같다. 여기여기에서 Laziness에 대해 아주 잘 기술하고 있는데, Laziness(‘process-only, on-demand’)는 요즘과 같이 Big data, 병렬 처리(parallel processing), 실시간 처리가 중요한 시대에 더 중요하다. 위 포스트에서는 우리가 온라인 쇼핑몰에서 쇼핑을 할 때 검색 결과 하단에 ‘See more products’라는 것을 예로 들며 Laziness를 설명한다. 하여튼, 요점은 요즘 더 중요해진 Laziness를 Stream API가 support한다는 것이다. Stream operations은 intermediate (Stream-producing) operationsterminal (value- or side-effect-producing) operations로 나뉘는데 intermediate operations는 항상 lazy하며, 그들의 내부 처리 모델은 많은 양의 데이터를 처리하는 것 & 높은 성능을 보장하도록 최적화 되어있다.
  4. Possibly unbounded. 제한이 없을 수도 있다.
    limit(n) 또는 findFirst()의 경우, 무한한 데이터라도 유한한 시간안에 연산을 끝마칠 수 있기 때문이다.
  5. Consumable. 즉 일회성이라는 것이다. Iterator처럼, Stream은 필요할 때마다 재생성되어야 한다.

Stream operations

intermediate (Stream-producing) operations

  • filter()
  • map()
  • sorted()
  • distinct()
  • limit()
  • .etc

terminal (value- or side-effect-producing) operations

  • max(), count()
  • reduce()
  • forEach()
  • .etc

Hi! I'm @Yeseul Lee
Passionate for what I love

GitHubLinkedIn