자바 인 액션_4

네코·2022년 8월 6일
0

자바인액션

목록 보기
3/3
post-thumbnail

스트림

정의

데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소입니다.

연속된 요소

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

소스

생성된 스트림은 원본 컬렉션, I/O 자원의 요소의 상태를 그대로 반영하고 있습니다.

데이터 처리 연산

filter, map, reduce, find, sort 등 DB와 비슷한 형태의 연산을 지원합니다.

스트림의 특징: 파이프 라이닝, 내부 반복

예제

  1. filter() : 람다를 인수로 받아 스트림에서 특정 요소를 제외시킵니다.
  2. map(): 람다를 이용해 한 요소를 다른 요소로 변환하거나 정보를 추출합니다.
  3. collect(): 변환 방법을 인수로 받아 스트림에 누적된 요소를 특정 결과로 변환시켜 반환합니다.

특징

  • 생성된 스트림은 딱 한번만 사용될 수 있습니다.(= 사용 후 소비되는 개념)
  • 내부 반복 처리로 작업을 손쉽게 병렬로 처리할 수 있습니다.
    이런 반복 처리 연산은 연산 리스트가 미리 정의되어있어야합니다(like map(), filter()등)
  • 중간 연산과 최종 연산 두가지 종류가 있습니다.
    중간 연산은 결과로 다른 스트림을 반환하고 최종 연산은 중간 연산의 합쳐진 결과에 대해 한번 처리됩니다.
    병렬적으로 처리되는 것을 볼 수 있습니다.
    (쇼트 서킷, 루프 퓨전 ?)

이용

크게 3가지 과정으로 나눌 수 있습니다.

  1. 질의를 수행할 데이터 소스 생성
  2. 스트림 파이프라인을 구성할 중간 연산 연결
  3. 스트림 파이프라인을 실행하고 결과를 만들 최종 연산

활용

필터링

스트림 인터페이스는 filter() 메서드를 지원합니다.
Predicate 인터페이스를 인자로 받아 만족하는 요소를 포함하는 스트림을 반환합니다.

고유 요소를 반환하는 distinct() 메서드를 지원합니다.
해당 메서드는 스트림에서 만든 객체의 hashCode(), equals로 결정됩니다.

슬라이싱

다음과 같이 Dish의 calories값이 정렬되어있다는 전제 하에 filter() 조건을 만족하지 않는 경우가 나올 때 바로 작업을 중단하고자 할 때 takeWhile() 메서드를 이용하면 가능합니다.
반대로 조건을 만족하지 않은 요소들을 구하고자할 때는 dropWhile()을 이용합니다

축소

스트림의 요소 중 앞에서 부터 n개의 요소를 선택하는 limit(n) 메서드를 지원합니다.
스트림의 요소 중 앞에서 부터 n개의 요소를 건너뛰는 skip(n) 메서드를 지원합니다.

매핑

스트림은 함수를 인자로 받는 map() 메서드를 지원합니다.
인수의 함수는 각 요소에 적용되며 적용 결과가 새로운 요소로 매핑됩니다.(=변환)

스트림 평면화

String 리스트 내의 알파벳으로 구성된 요소들 중에서 중복 없는 알파벳 리스트들을 반환하는 문제가 있다고 가정합니다.

ex) 리스트 내 ["abcddd", "abbbd"]가 존재한다면 ["a","b", "c","d"]가 반환

다음과 같은 코드를 시도할 수 있습니다.

문자열 요소들을 알파벳으로 나누고 나눠진 전체 알파벳 문자열들에 대해 distinct()메서드를 적용해 처리하고자 합니다. 그러나 위의 코드는 38번째 라인에서 같이 map을 통해 처리 시 각 요소들에 대해 별도의 스트림이 생성되어 원하는 결과를 내지 못합니다.

이 때 flatMap()을 통해 각 배열을 스트림이 아닌 스트림 콘텐츠로 매핑하여 처리할 수 있게됩니다.


검색과 매칭

특정 속성이 데이터 집합에 존재하는지를 확인하는 데이터 처리 메서드를 제공합니다.

anyMatch()

Predicate가 주어진 스트림에서 적어도 한 요소와 일치하는지를 확인합니다.
boolean을 반환하므로 최종연산입니다.

allMatch()

Predicate가 주어진 스트림에서 주어진 모든 요소가 만족하는지를 확인합니다.

noneMatch()

allMatch()의 반대를 검사합니다.즉 주어진 predicate을 만족하는 요소가 없는지 확인합니다.

findAny()

현재 스트림에서 임의의 요소를 반환합니다. filter가 선행되면 만족하는 가장 처음 요소를 반환합니다.
이 때 반환형은 Optional<T>입니다

0개의 댓글