숑숑이의 개발일기
article thumbnail

스트림(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 형태로 결과를 반환하기 때문에 연속적으로 연결해서 사용할 수 있다.

출처: tcpschool

 

생성

스트림의 생성을 정리하자면 아래의 표와 같다

분류 상세 분류 코드
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
profile

숑숑이의 개발일기

@숑숑-

풀스택 개발자 준비중입니다