본문 바로가기
Programming Language/Java & Kotlin

[Java] 스트림 API

by happy coding! 2019. 4. 16.
반응형

스트림 API

  • Java SE 8부터 추가된 스트림 API는 입력과 출력의 스트림과는 전혀 다른 개념

  • 자바에서는 많은 양의 데이터를 저장하기 위해서 배열이나 컬렉션을 사용함

  • 이렇게 저장된 데이터에 접근하기 위해서는 반복문이나 반복자(iterator)를 사용하여 매번 새로운 코드를 작성

  • 데이터베이스의 쿼리와 같이 정형화된 처리 패턴을 가지지 못했기에 데이터마다 다른 방법으로 접근해야만 했음

  • 이러한 문제점을 극복하기 위해서 Java SE 8부터 스트림(stream) API를 도입함

  • 스트림 API는 데이터를 추상화하여 다루므로, 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공

  • 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방법으로 다룰 수 있음

스트림 API의 특징

  1. 스트림은 외부 반복을 통해 작업하는 컬렉션과는 달리 내부 반복(internal iteration)을 통해 작업을 수행함
  2. 스트림은 재사용이 가능한 컬렉션과는 달리 단 한번만 사용할 수 있음
  3. 스트림은 원본 데이터를 변경하지 않음
  4. 스트림의 연산은 필터-맵(filter-map) 기반의 API를 사용하여 지연(lazy) 연산을 통해 성능을 최적화
  5. 스트림은 parallelStream() 메소드를 통한 손쉬운 병렬 처리를 지원

스트림 API의 동작 흐름

  • 스트림 API는 다음과 같이 세 가지 단계에 걸쳐서 동작함
  1. 스트림의 생성
  2. 스트림의 중개 연산 (스트림의 변환)
  3. 스트림의 최종 연산 (스트림의 사용)

스트림의 생성

  • 스트림 API는 다음과 같은 다양한 데이터 소스에서 생성할 수 있음
  1. 컬렉션
  2. 배열
  3. 가변 매개변수
  4. 지정된 범위의 연속된 정수
  5. 특정 타입의 난수들
  6. 람다 표현식
  7. 파일
  8. 빈 스트림

컬렉션

  • 자바에서 제공하는 모든 컬렉션의 최고 상위 조상인 Collection 인터페이스에는 stream() 메소드가 정의되어 있음
  • Collection 인터페이스를 구현한 모든 List와 Set 컬렉션 클래스에서도 stream() 메소드로 스트림을 생성할 수 있음
  • parallelStream() 메소드를 사용하면 병렬 처리가 가능한 스트림을 생성할 수 있음
  • Stream 클래스의 forEach() 메소드는 해당 스트림의 요소를 하나씩 소모해가며 순차적으로 요소에 접근하는 메소드
  • 단, 원본 데이터의 요소를 소모하는 것은 아니므로, 같은 데이터에서 또 다른 스트림을 생성하여 forEach() 메소드를 호출하는 것은 가능함

배열

  • 배열에 관한 스트림을 생성하기 위해 Arrays 클래스에는 다양한 형태의 stream() 메소드가 클래스 메소드로 정의되어 있음
  • 또한, 기본 타입인 int, long, double 형을 저장할 수 있는 배열에 관한 스트림이 별도로 정의되어 있음
  • 이러한 스트림은 java.util.stream 패키지의 IntStream, LongStream, DoubleStream 인터페이스로 각각 제공됨
  • Arrays 클래스의 stream() 메소드는 전체 배열뿐만 아니라 배열의 특정 부분만을 이용하여 스트림을 생성할 수도 있음

 

가변 매개변수

  • Stream 클래스의 of() 메소드를 사용하면 가변 매개변수(variable parameter)를 전달받아 스트림을 생성할 수 있음

 

출처 : http://tcpschool.com/java/java_stream_creation

반응형

'Programming Language > Java & Kotlin' 카테고리의 다른 글

[Java] 람다식  (0) 2019.06.13
[Java] Enum 클래스  (0) 2019.04.18
[Java] 람다 표현식  (0) 2019.04.15
[Java] StringBuffer  (1) 2018.12.01
[Java] Java 배열 정렬  (0) 2018.11.27

댓글