ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 스트림 API
    Programming Language/Java & Kotlin 2019. 4. 16. 16:50
    반응형

    스트림 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
Designed by Tistory.