스트림의 기본 개념

2022. 4. 12. 17:32·자바/스트림

1. 스트림이란?

- 스트림은 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들을 정의해 놓았다.

 

 

- 스트림은 Iterator처럼 일회용이다. 즉, 한번 사용한 스트림은 필요하다면 다시 생성해야 한다.

 

 

- 스트림은 작업을 내부 반복으로 처리한다. 

( 내부 반복이란, 반복문을 메서드의 내부에 숨길 수 있다는 것을 의미한다. )

 

 

- 장점으로는 두 가지가 있는데, 아래와 같다.

(1) 데이터 소스가 무엇이든지 간에 같은 방식으로 다룰 수 있다.

(2) 코드의 재사용성이 높아진다.

 

 

- 아래의 예시 String 배열과 List 배열을 보자.

 

( 그리고 이렇게 된 것을 정렬한다면, 아래와 같을 것이다. )

 

( 데이터 소스가 정렬되는 것은 아니라는 것에 유의하자. )

 

 

( 만약 다시 List(데이터소스)에 반환하고 싶다면, 아래의 코드를 쓰면 된다. )

 

 

 

 

2. 스트림의 연산

- 스트림이 제공하는 메서드 중에서 데이터 소스를 다루는 작업을 수행하는 것을 연산이라고 한다.

 

- 연산의 종류는 두 가지로 아래와 같다.

(1) 중간 연산

: 연산 결과가 스트림 연산으로, 스트림에 연속해서 중간 연산할 수 있다.

 

(2) 최종 연산

: 연산 결과가 스트림이 아닌 연산으로, 스트림의 요소를 소모하므로 단 한번만 가능하다.

 

 

( 아래의 예시를 보고 이해하자. )

 

- 중간 연산의 종류는 아래와 같다.

Stream<String> stream = Stream.of("dd","aa"}; 

 

(1) Stream<T> filter(Predicate<T> predicate)

: 조건에 안 맞는 요소 제외한다.

 

(2) Stream<T> distinct()

: 중복 제거한다.

 

(3) Stream<T> sorted() 

: 정렬한다.

 

(4) Stream<T> sorted(Comparator<T> comparator)

 

(5) Stream<T> limit(long maxSize)

: 스트림의 일부를 잘라낸다.

 

(6) Stream<T> skip(long n)

: 스트림의 일부를 건너뛴다.

 

(7) Stream<T> peek(Consumer<T> action)

 

( 스트림의 요소를 변환하는 메서드들은 816p 표14-5를 참고한다. )

 

( 최종 연산 메서드 목록은 817p 표14-6을 참고한다. )

 

 

 

 

3. 지연된 연산

- 최종 연산이 수행되기 전까지 중간 연산이 수행되지 않는다.

 

- 최종 연산이 수행되어야 비로소 스트림의 요소들이 중간 연산을 거쳐 최종 연산에서 소모된다.

 

 

 

 

4. Stream<Integer>와 IntStream

- 오토박싱과 언박싱으로 비효율을 줄이기 위해서 Stream<Integer>를 쓴 경우, IntStream을 제공한다.

 

- 또한 LongStream, DoubleStream도 제공한다.

 

 

 

 

5. 병렬 스트림

- 스트림으로 데이터를 다룰 때의 장점 중 하나는 병렬 처리가 쉽다.

 

- 병렬처리 함수는 parallel()을 사용하고, 반대로 처리되지 않게 하는 것은 sequential()을 호출한다.

( 디폴트 값은 sequential()이므로, 병렬 처리를 사용하지 않는다면 굳이 선언할 필요 없다. )

 

- parallel()과 sequential()은 새로운 스트림을 생성하는 것이 아니라, 그저 스트림의 속성을 변경한다.

 

 

'자바 > 스트림' 카테고리의 다른 글

Optional<T>와 OptionalInt  (0) 2022.04.15
스트림의 중간 연산(3)  (0) 2022.04.14
스트림의 중간 연산(2)  (0) 2022.04.14
스트림의 중간 연산(1)  (0) 2022.04.13
스트림 만들기  (0) 2022.04.13
'자바/스트림' 카테고리의 다른 글
  • 스트림의 중간 연산(3)
  • 스트림의 중간 연산(2)
  • 스트림의 중간 연산(1)
  • 스트림 만들기
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      제자리 정렬
      안정 정렬
      map()
      코딩테스트
      자바 개념
      알고스팟
      소켓 프로그래밍
      TCP 소켓 프로그래밍
      역직렬화
      Arrays
      불안정 정렬
      다형성
      file
      스트림
      문자 기반 스트림
      ServerSocket
      유용한 클래스
      outputstream
      코딩트리조별과제
      java.lang패키지
      선택 정렬
      java.time 패키지
      Collections Framework
      안드로이드 스튜디오
      코드트리
      InputStream
      serializable
      중간연산
      람다식
      snail
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    스트림의 기본 개념
    상단으로

    티스토리툴바