Java Stream

곽동현·2022년 10월 21일

JAVA

목록 보기
6/6
post-thumbnail

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

많은 수의 데이터를 다룰 때, 컬렉션이나 배열에 데이터를 담아 원하는 결과 도출을 위해 for문Iterator를 이용해서 코드를 작성하는 방식이 있다.
이 방식의 단점은 코드 길이가 매우 길어지고 알아보기도 쉽지 않기 때문에 가독성 및 재사용성이 떨어진다는 것이다.
이를 해결하기 위해 스트림이 등장하게 되는데 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메소드들을 정의한 인터페이스인 것이다.


연속된 요소?

  • 스트림은 특정 요소 형식으로 이루어진 연속된 값 집합의 인터페이스를 제공한다.

소스?

  • 스트림은 Collection, Array, I/O 자원 등의 데이터 제공 소스로부터 데이터를 소비한다.

데이터 처리 연산?

  • 스트림 연산은 순차적으로 혹은 병렬 처리로 실행이 가능하다.
String[] arr = {"aaa","bbb","ccc"}; // 배열 초기화
List<String> list = Arrays.asList(arr); // 리스트에 배열 원소들 저장

Stream<String> stream1 = list.stream();
Stream<String> stream2 = Arrays.stream(arr);

스트림은 데이터 소스를 변경하지 않는다.

스트림은 데이터 소스로부터 데이터를 읽기만 할 뿐,
데이터 소스를 변경하지 않는다는 특성이 있다. 필요 시에 정렬된 결과를 컬렉션이나 배열에 담아 반환할 수 있다.

List<String> list = stream2.sorted().collect(Collectors.toList());

스트림의 연산

스트림이 제공하는 연산 과정은 중간 연산과 최종 연산으로 분류된다. 중간 연산은 연산결과를 스트림으로 반환하기 때문에 중간 연산을 연속해서 연결 할 수 있다. 하지만 최종 연산은 스트림의 요소를 소모하면서 연산을 수행하는 것이므로 단 한번만 연산이 가능하다.

  • 중간 연산:
    - Stream을 리턴함
    - Lazy한 특성
    - method - filter, map, limit, skip, sorted, flatmap...

여기서 lazy하다는 말은 최종 연산이 나오기 전까지는 실행하지 않는 것을 뜻합니다.

  • 최종 연산:
    - Stream을 리턴하지 않음
    - collect, allMatch, count, forEach, min, max...

  • 스트림은 일회성을 가진다.
  • 스트림은 작업을 내부 반복으로 처리한다.
  • 함수형 인터페이스(lamda)를 적용한 방법이다.
  • Collection 자손 : List, Set과 같은 클래스
    ...

각 연산 과정에 포함된 메서드를 잘 숙지하고 적용하자

docs:
https://incheol-jung.gitbook.io/docs/q-and-a/java/stream

profile
읽고 쓰며 생각합니다 💡

0개의 댓글