상세 컨텐츠

본문 제목

[JAVA] 내가 사랑하는 stream에 대하여...

Programming Language/Java

by yooputer 2024. 10. 24. 22:28

본문

 

컬렉션(Collection)

  • 유사한 객체 집단을 효율적으로 관리하기 위한 자료구조
  • List, Set, Map, Queue, Stack, ...
  • ArrayList는 List 인터페이스를 상속한 클래스

스트림(Stream)

  • 컬렉션, 배열, 입출력 자원과 같은 데이터 집합체를 반복적으로 처리하는 기능
  • 스트림 데이터와 스트림 연산의 개념을 모두 포함
  • JDK8부터 추가

컬렉션과 스트림의 비교

구분 컬렉션 스트림
처리 방식 다운로드 스트리밍
저장공간 필요 불필요
반복 방식 외부 반복 내부 반복
코드 구현 명령형 선언형
원본 데이터 변경 변경하지 않고 소비
연산 병렬화 어려움 쉬움

스트림 종류

  • Stream : 객체 원소로 구성
  • IntStream : int 타입의 원소로 구성
  • LongStream : long 타입의 원소로 구성
  • DoubleStream : double 타입의 원소로 구성

스트림 연산 구조

  1. Stream 생성 : 데이터를 Stream으로 변환, 최초 1번 수행
  2. Stream 가공 : 필터, 변형, 정렬 등의 중간 연산. 입력값은 stream, 출력값도 stream. 메서드 체이닝 가능
  3. Stream 소비 : 최종연산 수행. 1번만 수행 가능. 출력값이 stream이 아님

스트림 생성

// ArrayList -> Stream
List<String> list = Arrays.asList("1", "2", ...);
Stream<String> ss = list.stream();

// 배열 -> Stream
String[] array = {"A", "B", "C"};
Stream<String> ss2 = Arrays.stream(array);
Stream<String> ss3 = Stream.of(array);
int[] intArray = {1, 2, 3};
IntStream is = Arrays.stream(intArray);

// Stream 메서드
Stream<String> ss4 = Stream.generate(() -> "ha"); // 무한스트림
Stream<Integer> is2 = Stream.iterate((1, n -> n * 2) // 초기값 1이고, 다음 요소는 이전요소에 2를 곱한 값
IntStream is3 = IntStream.rangeClosed(1, 100) // 1부터 100까지

스트림 중간연산

메서드명 인자 설명
filter Predicate true인 요소만 필터링
map Function 다른 요소로 매핑
mapToInt ToIntFunction int로 매핑
mapToLong ToLongFunction long으로 매핑
mapToDouble ToDoubleFunction double로 매핑
flatMap Function 중첩된 스트림을 평면화
sorted X 정렬
Comparator 주어진 정렬 기준으로 정렬
peek Consumer 특정 연산 수행
distinct X 중복 제거
limit long maxSize 스트림 크기를 n으로 제한
skip long n n개 건너뛰기

 

스트림 최종연산

메서드명 인자 반환값 설명
collect Collector   특정 자료형으로 변환
toArray   Object[] 배열로 변환
IntFunction Object[] 배열로 변환
min Comparator Optional<T> 최소값 반환
max Comparator Optional<T> 최대값 반환
count   long 요소 개수 반환
anyMatch Predicate boolean 한 요소라도 조건을 만족하는지 반환
allMatch Predicate boolean 모든 요소가 조건을 만족하는지 반환
noneMatch Predicate boolean 모든 요소가 조건을 만족하지 않는지 반환
findFirst   Optional<T> 병렬처리시 stream 순서를 고려하여 가장 첫번째 요소 반환
findAny   Optional<T> 병렬처리시 가장 먼저 찾은 요소 반환(직렬처리시  findFirst와 동일)
forEach Consumer void 연산 수행
reduce BinaryOperator   원소들을 하나씩 소모해가며 누적 계산을 수행하고 결과값 반환

 


지연평가

  • 중간연산은 즉시 수행되지 않고, 최종 연산이 호출될 때까지 지연

데이터 처리 순서

  • 정수기 필터...

병렬처리

  • parallel(), parallelStream() 연산을 통해 멀티 스레드를 사용한 병렬 처리가 가능

내가 실무에서 스트림을 사용하는 방법


참고자료

우종정, 「쉽게 배우는 자바 프로그래밍」, 한빛아카데미


https://docs.oracle.com/javase/8/docs/api/

 

Java Platform SE 8

 

docs.oracle.com

 

https://www.elancer.co.kr/blog/detail/255

 

java stream이란 특징부터 사용하는 이유까지 모두 알려드립니다. I 이랜서 블로그

데이터가 중요해 질수록 강력한 데이터 처리 기능을 선보이며 데이터 처리 효율을 높여주는 ‘Java Stream’를 찾는 사람들이 많아지고 있는데요. 이랜서에서 java stream이란 무엇인지 자세히 알려

www.elancer.co.kr

https://bcp0109.tistory.com/313

 

Java 8 함수형 인터페이스 (Functional Interface)

Overview 함수형 인터페이스란 1 개의 추상 메소드를 갖는 인터페이스를 말합니다. Java8 부터 인터페이스는 기본 구현체를 포함한 디폴트 메서드 (default method) 를 포함할 수 있습니다. 여러 개의 디

bcp0109.tistory.com

https://devjjsjjj.tistory.com/entry/Java-Stream-findAny%EC%99%80-findFirst%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90

 

[JAVA] Stream - findAny()와 findFirst()의 차이점

Stream에서 어떤 조건에 일치하는 요소(element) 1개를 찾을 때, findAny()와 findFirst() API를 사용할 수 있습니다. findAny()는 Stream에서 가장 먼저 탐색되는 요소를 리턴하고, findFirst()는 조건에 일치하는

devjjsjjj.tistory.com

https://velog.io/@jwkim/java-stream-reduce-binaryoperator

 

[Java] Stream의 reduce()와 BinaryOperator

[Java] Stream의 reduce()와 BinaryOperator

velog.io