Programing Language/Java

Stream

jheaon 2024. 5. 9. 07:48

 

오늘은 Java Stream에 대해서 알아보고자 한다. 

 


 

Stream

스트림(Stream)이란 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소로 정의 할 수 있다. 

  • 데이터 처리 연산 : 스트림은 함수형 프로그래밍 언어에서 일반적으로 지원하는 연산(filter, map, reduce, find, match, sort...) 등으로 데이터를 조작할 수 있으며, 스트림 연산을 데이터를 순차적으로 또는 병렬적으로 실행 할 수 있다. 
  • 소스 : 스트림은 컬렉션, 배열, I/O 자원 등의 데이터 제공 소스로부터 데이터를 소비한다. 정렬된 컬렉션으로 스트림을 생성하면 정렬이 그대로 유지된다. 
  • 연속된 요소 : 컬렉션과 마찬가지로 스트림은 특정 요소 형식으로 이루어진 연속된 값 집합의 인터페이스를 제공한다. 컬렉션은 자료구조이므로 컬렉션에서는 시간과 공간 복잡성과 관련된 요소 (저장, 접근) 연산이 주를 이룬다면 스트림은 fitler, map, sorted처럼 표현 계산식이 주를 이룬다. 

쉽게 말하자면 컬렉션은 자료구조, 스트림은 자료구조의 연산을 도와주는 역활이라고 이해하면 될 듯 하다. 

 

Stream은 아래와 같은 특징을 가진다. 

  • Stream은 원본의 데이터를 변경하지 않는다.
  • Stream은 재사용이 불가능하다. 
  • Stream은 내부 반복으로 작업을 처리한다. 

 

사용법

Stream은 객체를 구성하고자 할 때, "Stream 생성 -> 중간 연산 -> 최종 연산"의 세 단계의 과정을 거친다. 

객체.Stream생성().중간연산.최종연산()

 

 

Collection 인터페이스에는 stream()이 정의되어 있기 때문에, Collection 인터페이스를 구현한 객체들은 모두 메소드를 이용해 Stream을 생성 할 수 있다. 

 

스트림 생성 ~ 최종연산까지 정리한 글 중에서 매우 잘 정리한글이 있어 이를 참고하여 작성하고자 한다. 

 

[Java] Stream API -1 이해하기: 용어 및 Stream 생성

해당 글의 목적은 Stream API를 이해하고 예제를 통한 이해를 돕기 위해 작성한 글입니다. 주된 내용은 Stream과 관련된 용어를 이해하며 Stream을 생성하는 메서드에 대해서 이해합니다. 해당 글에서

adjh54.tistory.com

 

 

 

 

Stream 생성

분류 상세 분류 예제
Stream 생성 empty stream 생성 Stream.empty();
Stream 생성 Collection 생성 ArrayList.stream();
Stream 생성 Array 생성-1 Arrays.stream(Arr);
Stream 생성 Array 생성-2 Stream.of("one", "two", "three")
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 생성 기본 타입 스트림 생성 IntStream intStream = IntStream.range(1, 5);
LongStream longStream = LongStream.rangeClosed(1, 5);
DoubleStream doubleStream = DoubleStream.iterate(100, (n) -> n + 10).limit(3);
Stream 생성 파일 스트림 생성 Files.lines(Paths.get("file.txt"), Charset.forName("UTF-8"));

 

 

 

 

 

Stream 중간연산

분류 상세 분류 설명
Stream 필터 filter(), distinct() - filter()는 구성한 스트림 내에서 특정 조건에 맞는 결과값을 필터링 하기 위해 사용됩니다.
- distinct()는 구성한 스트림 내에서 중복을 제거한 결과값을 반환하기 위해 사용됩니다.
Stream 변환 map(), flatMap() - map()은 구성한 스트림 내에서 요소들을 원하는 값으로 변환하여서 반환하기 위해 사용됩니다.
- flatMap()는 구성한 스트림 내에서 중복된 스트림을 평면화(flattern)하여 요소를 구성하여 반환하기 위해 사용됩니다.
Stream 제한 limit(), skip() - limit()는 구성한 스트림 내에서 요소의 개수를 제한하여 반환해주기 위한 목적으로 사용됩니다.
- skip()는 구성한 스트림 내에서 시작부터 특정 n개의 요소를 제외하여 반환해주는 목적으로 사용합니다.
Stream 정렬 sorted() - sorted()는 구성한 스트림 내에서 배열 혹은 리스트 그리고 Object의 요소에 대해서 오름/내림 차순을 수행하여 반환해주는 함수입니다.
Stream 연산 결과 확인 peek() - peek()는 구성한 스트림 내에서 각각의 요소를 조회하는 연산자료 요소 자체를 추출하는것이 아닌 스트림의 요소를 조회하는 함수입니다.

 

 

 

 

 

Stream 최종연산

분류 상세 분류 설명
요소의 출력 forEach() - forEach()는 배열 혹은 리스트 내에서 순회를 하며 요소에 대한 값을 얻어서 요소에 대한 출력 혹은 값을 새로운 형태로 변환하여 구성을 하기 위한 목적으로 사용이 됩니다.
요소의 검색 findFirst(), findAny() - findFirst()는 스트림 내에서 조건에 “일치하는 요소들 중”에서 “가장 앞에 있는 요소”를 리턴해주는데 사용되는 함수입니다.
- findAny()는 스트림 내에서 조건에 “일치하는 요소들 중”에서 “먼저 탐색되는 요소”를 리턴해주는데 사용하는 함수입니다.
요소의 검사 anyMatch(), allMatch(), noneMatch() - anyMatch()는 스트림 내의 요소들 중 주어진 조건에 맞는 요소가 “하나 라도 맞는다면” true의 값을 반환해주는데 사용하는 함수입니다.
- allMatch()는 스트림 내의 요소들 중 “모두 해당 조건에 맞는지”에 대해 판단하여 모두 맞으면 true 값을 반환해주는데 사용하는 함수입니다.
- noneMatch()는 스트림 내의 요소들 중 “주어진 조건에 맞는 요소가 없는지”에 대해 판단하여 모두 없다면 true 값을 반환해주는데 사용하는 함수입니다. 
요소의 통계 count(), min(), max() - count()는 스트림 내의 요소들 중 총 요소의 개수를 반환해주는데 사용하는 함수입니다.
- min()는 스트림 내의 요소들 중 “가장 작은 값”을 반환해주는데 사용하는 함수입니다.
- max()는 스트림 내의 요소들 중 “가장 큰 값”을 반환해주는데 사용하는 함수입니다. 
요소의 연산 sum(), average()  - sum()은 스트림 내의 모든 요소들을 더하여 하나의 값으로 반환해주는 함수입니다.
- average()는 스트림 내의 요소들의 평균 값을 계산해주어 하나의 값으로 반환해주는 함수입니다. 
요소의 수집 collect() - collect()는 스트림 내의 모든 요소들을 수집하여 사용자가 원하는 형태로 변환하는데 사용하는 메소드입니다.

 

'Programing Language > Java' 카테고리의 다른 글

Enum  (0) 2024.05.31
Optional  (0) 2024.05.24
Thread (수정중)  (1) 2024.05.01
String 객체  (0) 2024.04.30
Collections Framework  (0) 2024.04.26

'Programing Language/Java'의 다른글

  • 현재글 Stream

관련글