스트림(Stream) API란?
스트림 API는 람다식(Lambda Expression)을 이용한 기술 중 하나로 데이터 소스(컬렉션, 배열, 난수, 파일 등..)를 조작 및 가공, 변환하여 원하는 값으로 반환해주는 인터페이스를 의미한다. 스트림을 사용하기 위해서는 Java 1.8 이상
의 버전을 사용해야 한다. 해당 인터페이스는 java.util.stream
에 포함되어 있다.
람다식이란?
함수를 하나의 식으로 표현한 함수형 인터페이스. 함수를 람다식으로 표현하면 메소드의 이름이 없기 때문에 익명 함수(Anonymous Function)의 한 종류라고도 한다.
스트림(Stream) API의 특징
1. Stream은 원본의 데이터를 변경하지 않는다.
Stream API는 원본 데이터를 조회하여 별도의 Stream 객체로 생성한다. 때문에 배열의 정렬이나 필터링 작업을 하더라도 원본 데이터를 변경하지 않는다.
2. Stream은 재사용이 불가능하여 단 한 번만 사용할 수 있다.
Stream은 재사용이 가능한 컬렉션과는 달리 일회용으로 사용된다. 만일 재사용을 시도한다면 java.lang.illegalStateException 오류가 발생하여 새로운 Stream을 생성해주어야 한다.
3. Stream은 내부 반복(internal iteration)을 통해 작업을 수행한다.
Stream 내에서 내부적으로 반복문을 처리하기 때문에 간결한 소스코드를 작성할 수 있다.
4. 필터-맵(filter-map) 기반의 API를 사용하여 지연(lazy) 연산을 통해 성능을 최적화 한다.
5. parallelStream() 메서드를 통해 손쉬운 병렬 처리를 지원한다.
스트림의 동작 흐름
스트림은 스트림의 생성 > 중개연산(필터) > 최종연산(맵)
의 세 가지 단계에 걸쳐서 동작하며, 중개 연산의 경우 Stream 형태로 결과를 반환하기 때문에 연속적으로 연결해서 사용할 수 있다.
생성
스트림의 생성을 정리하자면 아래의 표와 같다
분류 | 상세 분류 | 코드 |
Stream 생성 | empty stream | Stream.empty(); |
Stream 생성 | Collection | ArrayList.stream(); |
Stream 생성 | Array | 1)Arrays.stream(arr); 2)Stream.of("1","2","3") |
Stream 생성 | Stream.builder() | Stream.<String>builder().add("a").build(); |
Stream 생성 | Stream.generate() | Stream.generate(()->"a").limit(3); |
Stream 생성 | Stream.Iterator() | Stream.iterate(70, (n) -> n+10).limit(3); |
Stream 생성 | 기본 타입 스트림 | 1)IntStream intStream = IntStream.range(1, 5); 2)LongStream longStream = LongStream.rangeClose(1, 5); 3) DoubleStream doubleStream = DoubleStream.iterate(100, (n) -> n+1).limit(3); |
Stream 생성 | 파일 스트림 | Files.lines(Paths.get("file.txt"),Charset.forName("UTF-8")) |
중간 연산
분류 | 상세 분류 |
Stream 필터 | filter(), distinct() |
Stream 변환 | map(), flatMap() |
Stream 제한 | limit(), skip() |
Stream 정렬 | sorted() |
Stream 연산 결과 확인 | peek() |
최종 연산
분류 | 상세 분류 |
요소의 출력 | forEach() |
요소의 검색 | findFirst(), findAny() |
요소의 검사 | anyMatch(), allMatch(), noneMatch() |
요소의 통계 | count(), min(), max() |
요소의 연산 | sum(), average() |
요소의 수집 | collect() |
https://adjh54.tistory.com/107
https://www.tcpschool.com/java/java_stream_concept
'Backend > JAVA' 카테고리의 다른 글
[JAVA] 쓰레드(Thread)란? Java의 동기화 기능은 무엇일까? (2) | 2024.01.25 |
---|---|
[JAVA] iterator와 iterable의 차이는 무엇일까? (0) | 2024.01.24 |
[JAVA] JVM의 메모리 구조 (0) | 2024.01.17 |
[Java] #19.3 자바 입출력 - char 단위 입출력 (0) | 2023.08.15 |
[Java] #19-2 자바 입출력 - byte 단위 입출력 (0) | 2023.08.14 |