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 |