Stream

업데이트:

데이터 컬렉션 반복을 멋지게 처리하는 기능이다.

자바8에서 추가된 기능으로써 멀티스레드 코드 없이 데이터를 병렬로 처리 가능하다.

스트림의 특징

  1. 선언형 : 더 간결하고 가동성이 높아짐
  2. 조립할 수 있음 : 유연성이 좋아진다.
  3. 병렬화 : 성능이 좋아진다.

스트림 시작하기

데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소

  1. 연속된 요소
    • 특정 요소 형식으로 이루어진 연속된 값 집합의 인터페이스를 제공
    • filter, sorted, map처럼 표현 계산식이 주를 이룸
    • 스트림의 주제는 계산이다.
  2. 소스
    • 제공된 소스로부터 데이터를 사용, 즉 스트림을 생성하면 정렬이 그대로 유지
  3. 데이터 처리 연산
    • 데이터베이스와 비슷한 연산을 지원
    • 순차적으로 또는 병렬로 실행 가능
  4. 파이프라이닝
    • 스트림 자신을 반환 가능, 스트림 연산끼리 연결할 수 있다(파이프라인 구성)
    • 게으름, 쇼트서킷과 같은 최적화 가능
  5. 내부 반복
    • 컬렉션과 달리 스트림은 내부 반복을 지원
public static List<String> threeHighCaloricDishNames =
    menu.stream()
        .filter(dish -> dish.getCalories() < 400)
        .map(Dish::getName)
        .limit(3)
        .collect(toList());
}

https://user-images.githubusercontent.com/68995534/109262961-cb129000-7845-11eb-9623-4e47b66c9d86.png

스트림과 컬렉션

컬렉션

  • 적극적 생성(생산자 중심)
  • 모든 요소는 컬렉션에 추가하기 전에 계산되어야 한다.
  • 연산을 수행할때마다 변경점과 추가 요소가 미리 계산되어야 함

스트림

  • 게으른 생성(요청 중심, 즉석 제조)
  • 요청할 때만 요소를 계산
  • 스트림에서 요소를 추가하거나 제거할 수 없음
  • 스트림은 일회성이다.(한번 쓰면 다시 사용할 수 없음)

https://user-images.githubusercontent.com/68995534/109263010-e5e50480-7845-11eb-8f90-8a2a91b72758.png

외부 반복과 내부 반복

외부 반복(컬렉션)

  • 병렬성을 스스로 관리(for-each)

https://user-images.githubusercontent.com/68995534/109263045-f9906b00-7845-11eb-8bc4-c64c59e5768f.png

내부 반복(스트림)

  • 반복을 내부에서 처리하고 결과를 반환
  • 개발자가 반복자나 반복 과정을 신경쓰지 않아도 됨
  • 작업을 투명하게 병렬로 처리하거나 최적화된 다양한 순서로 처리할 수 있게 해줌

https://user-images.githubusercontent.com/68995534/109263051-fbf2c500-7845-11eb-9f3e-9c87370ba061.png

스트림 연산

중간 연산과 최종 연산이 존재

중간 연산

  • 연결할 수 있는 스트림 연산
  • filter, map, limit 등등
  • stream을 반환

최종 연산

  • 스트림을 닫는 연산
  • void, List, Integer 등등
  • stream 이외의 결과를 반환

https://user-images.githubusercontent.com/68995534/109263106-0b720e00-7846-11eb-94a3-ee01598161c0.png

스트림 이용하기

스트림 이용 과정

  • 질의를 수행할 (컬렉션) 데이터 소스
  • 스트림 파이프라인을 구성할 중간 연산 연결
  • 스트림 파이프라인을 실행하고 결과를 만들 최종 연산

https://user-images.githubusercontent.com/68995534/109263114-0f059500-7846-11eb-89fc-119ec866b3f1.png

다음에는 어떤 연산들이 있는지 더 알아보고 내가 주로 사용하는 연산에 대해 소개하겠다.

참고

모던 자바 인 액션 Chapter.4

태그:

업데이트:

댓글남기기