노트 :

스트림(Stream) 본문

JAVA

스트림(Stream)

IT_달토끼 2023. 12. 24. 22:31

 

1. 스트림: 데이터소스를 추상화하여 자료의 대상에 관계없이 같은 방식으로 연산을 수행할 수 있도록 함

 

2. 스트림 사용의 장점

1) 연산의 추상화: 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방식으로 처리 가능

2) 코드의 재사용성 증가. 단 스트림 자체는 일회용임

 

3. 스트림 생성

① String[] strArr = {"Amy", "Bella", "Chris"};
=> Stream<String> stream1 = Arrays.stream(strArr);
=========================================
② List<String> strList = Arrays.asList(strArr);
=> Stream<String> stream2 = strList.stream();

 

4. 스트림의 특징

1) 일회용: 생성한 스트림은 한번 사용하면 닫혀서 다시 사용할 수 없음. 필요시 재성성

int[] arr = {1, 2, 3, 4, 5};
① Arrays.stream(arr).forEach(n->System.out.print(n); // 생성한 스트림 사용
② System.out.print(Arrays.stream(arr).sum()); // 필요시 재생성

 

2) 중간연산과 최종연산

* 중간연산: 연산 결과가 스트림인 연산. 스트림에 연속해서 중간연산할 수 있음
* 최종연산: 연산 결과가 스트림이 아닌 연산. 스트림의 요소를 소모하므로 단 한번만 가능

 

지연된 연산: 최종연산이 수행되기 전까지는 중간연산이 수행되지 않음. 중간연산을 호출하는 것은 연산을 지정해주는 것일 뿐 최종연산이 수행되어야지 비로소 스트림의 요소들이 중간연산을 거쳐 최종연산에서 소모됨

List<String> strList = new ArrayList<>();
strList.add("Amy");
strList.add("Bella");
strList.add("Chris");
Stream<String> strStream = strList.stream();
strStream.sorted().forEach(s->System.out.print(s));
// sorted(): 중간연산 -> 정렬
// forEach(s->System.out.print(s)): 최종연산 ->객체를 순회하여 요소를 출력

 

5. 스트림의 연산 목록

1) 중간연산 목록

중간연산 설명
ㆍStream<T> distinct () 중복을 제거
Strema<T> filter (Predicate<T> predicate) 조건에 안 맞는 요소 제외
Stream<T> limit (long maxSize) 스트림의 일부를 잘라낸다.
Stream<T> skip (long n) 스트림의 일부를 건너뛴다.
Stream<T> peek (Consumer<T> action) 스트림의 요소에 작업수행
Stream<T> sorted()
Stream<T> sorted(Comparator<T> comparator)
스트림의 요소를 정렬한다.
Stream<R> map (Function<T,R> mapper)
DoubleStream mapToDouble (ToDoubleFunction<T> mapper)
IntStream mapToInt (ToIntFunction<T> mapper)
LongStream mapToLong (ToLongFunction<T> mapper)
Stream<R> flatMap (Function<T, Stream<R>> mapper)
DoubleStream flatMapToDouble (Function<T, DoubleStream> m)
IntStream flatMapToInt (Function<T, IntStream> m)
LongStream flatMapToLong (Function<T, LongStream> m)

스트림의 요소를 변환한다.

 

2) 최종연산 목록

최종연산 설명
void forEach (Consumer<? super T> action)
void forEachOrdered (Consumer<? super T> action)
각 요소에 지정된 작업을 수행
long count () 스트림의 요소의 개수 반환
Optional<T> max (Comparator<? super T> comparator)
Optional<T> min (Comparator<? super T> comparator)
스트림의 최대값/최소값 반환
boolean allMatch (Predicate<T> p)    // 모두 만족하는지 여부
boolean anyMatch (Predicate<T> p)  // 하나라도 만족하는지 여부
boolean nonMatch (Predicate<T> p)  // 모두 만족하지 않는지 여부
주어진 조건을 모든 요소가 만족시키는지, 만족시키지 않는지 확인
Object[] toArray()
A[] toArray (IntFunction<A[]> generator)
스트림의 모든 요소를 배열로 반환
Optional<T> reduce (BinaryOperator<T> accumulator)
T reduce (T identity, BinaryOperator<T> accumfulator)
U reduce (U identity, BiFunction<U,T,U> accumulator,BinaryOperator<U> combiner)
스트림의 요소를 하나씩 줄여가면서 계산한다.
R collect (Collector<T,A,R> collector)
R collect (Supplier<R> supplier, BiConsumer<R,T> accumulator,BiConsumer<R,R> combiner)
스트림의 요소를 수집한다.
주로 요소를 그룹화하거나 분할한 결과를 컬렉션에 담아 반환하는데 사용된다.

 

 

 

 

참고: 자바의 정석(3rd Edition), 남궁 성 저, 도우출판