πŸ’Ž/Java

[Java] 슀트림 Stream

dar0m! 2021. 7. 28. 19:00

κ°œλ…

μŠ€νŠΈλ¦Όμ€ 반볡자

μŠ€νŠΈλ¦Όμ€ μ»¬λ ‰μ…˜(λ°°μ—΄ 포함)의 μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© μ°Έμ‘°ν•΄μ„œ λžŒλ‹€μ‹μœΌλ‘œ μ²˜λ¦¬ν•  수 μžˆλŠ” λ°˜λ³΅μžμ΄λ‹€.

λžŒλ‹€μ‹, 슀트림 λ‘˜ λ‹€ μžλ°” 8λΆ€ν„° μ‚¬μš© κ°€λŠ₯
8μ΄μ „μ—λŠ” Iteratorλ₯Ό μ‚¬μš©ν•¨

 

νŠΉμ§•

1. λžŒλ‹€μ‹μœΌλ‘œ μš”μ†Œ 처리 μ½”λ“œλ₯Ό μ œκ³΅ν•œλ‹€.

  • 슀트림이 μ œκ³΅ν•˜λŠ” λŒ€λΆ€λΆ„μ˜ μš”μ†Œ 처리 λ©”μ†Œλ“œλŠ” ν•¨μˆ˜μ  μΈν„°νŽ˜μ΄μŠ€ λ§€κ°œνƒ€μž…을 κ°€μ§„λ‹€.
  • λ§€κ°œκ°’μœΌλ‘œ λžŒλ‹€μ‹ λ˜λŠ” λ©”μ†Œλ“œ μ°Έμ‘°λ₯Ό λŒ€μž…ν•  수 μžˆλ‹€.

2. λ‚΄λΆ€ 반볡자λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ 병렬 μ²˜λ¦¬κ°€ 쉽닀.

  • μ™ΈλΆ€ 반볡자(ex. Iterator)
    - κ°œλ°œμžκ°€ μ½”λ“œλ‘œ 직접 μ»¬λ ‰μ…˜ μš”μ†Œλ₯Ό λ°˜λ³΅ν•΄μ„œ μš”μ²­ν•˜κ³  κ°€μ Έμ˜€λŠ” μ½”λ“œ νŒ¨ν„΄
  • λ‚΄λΆ€ 반볡자
    - 개발자 μ½”λ“œκ°€ λžŒλ‹€μ‹μ΄λ˜κ³ , μ»¬λ ‰μ…˜μ€ λ‚΄λΆ€μ μœΌλ‘œ μš”μ†Œλ“€μ„ λ°˜λ³΅ν•˜λŠ” μŠ€νŠΈλ¦Όμ„ ν™œμš©ν•΄μ„œ λžŒλ‹€μ‹μ„ μš”μ†Œλ§ˆλ‹€ μ μš©μ‹œν‚΄.
    - μ»¬λ ‰μ…˜ λ‚΄λΆ€μ—μ„œ μš”μ†Œλ“€μ„ λ°˜λ³΅μ‹œν‚€κ³  κ°œλ°œμžλŠ” μš”μ†Œλ‹Ή μ²˜λ¦¬ν•΄μ•Όν•  μ½”λ“œλ§Œ μ œκ³΅ν•˜λŠ” νŒ¨ν„΄
  • λ‚΄λΆ€ 반볡자의 이점(Stream 의 이점)
    - κ°œλ°œμžλŠ” μš”μ†Œ 처리 μ½”λ“œμ—λ§Œ 집쀑(iterator.next()같은 것을 ν•˜μ§€ μ•Šμ•„λ„ 됨 였직 μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠ”μ§€λ§Œ μ •μ˜ν•¨)
    - λ©€ν‹° μ½”μ–΄ CPUλ₯Ό μ΅œλŒ€ν•œ ν™œμš©ν•˜κΈ° μœ„ν•΄ μš”μ†Œλ“€μ„ λΆ„λ°°μ‹œμΌœ 병렬 처리 μž‘μ—…μ„ ν•  수 μžˆλ‹€.
  • 병렬(parallel) 처리
    - parallelStream();
    - ν•œκ°€μ§€ μž‘μ—…μ„ μ„œλΈŒ μž‘μ—…μœΌλ‘œ λ‚˜λˆ„κ³ , μ„œλΈŒ μž‘μ—…λ“€μ„ λΆ„λ¦¬λœ μŠ€λ ˆλ“œμ—μ„œ λ³‘λ ¬μ μœΌλ‘œ μ²˜λ¦¬ν•œ ν›„, μ„œλΈŒ μž‘μ—…λ“€μ˜ 결과듀을 μ΅œμ’… κ²°ν•©ν•˜λŠ” 방법 → μž‘μ—… κ²°κ³Όκ°€ μˆœμ°¨μ μ΄μ§€ μ•ŠμŒ
    - μžλ°”λŠ” ForkJoinPool ν”„λ ˆμž„μ›Œν¬λ₯Ό μ΄μš©ν•΄μ„œ 병렬 처리λ₯Ό ν•œλ‹€.

3. μŠ€νŠΈλ¦Όμ€ 쀑간 μ²˜λ¦¬μ™€ μ΅œμ’… 처리λ₯Ό ν•  수 μžˆλ‹€.

  • 쀑간 처리 : Stream을 λ¦¬ν„΄ν•œλ‹€. μš”μ†Œλ“€μ˜ λ§€ν•‘, 필터링, μ •λ ¬ λ“±
    (filter, map, limit, skip, sorted)
  • μ΅œμ’… 처리 : Stream을 λ¦¬ν„΄ν•˜μ§€ μ•ŠλŠ”λ‹€. 반볡, 카운트, 평균, 총합 λ“±
    (collect, allMatch, count, forEach, min, max..)

4. μŠ€νŠΈλ¦Όμ€ 데이터λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ©° μΌνšŒμš©μ΄λ‹€.

 

슀트림 μ’…λ₯˜

java.util.stream νŒ¨ν‚€μ§€μ—μ„œ μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ 제곡

λͺ¨λ“  슀트림 μΈν„°νŽ˜μ΄μŠ€λŠ” BaseStream을 상속받고 μžˆλ‹€. 곡톡 λ©”μ†Œλ“œκ°€ μ •μ˜λ˜μ–΄ μžˆλ‹€.

 Stream <T>  λ²”μš© Stream 
 IntStream  κ°’ νƒ€μž…μ΄ Int인 Stream
 LongStream  κ°’ νƒ€μž…μ΄ Long인 Stream
 DoubleStream  κ°’ νƒ€μž…μ΄ Double인 Stream

 

Stream의 쀑간 μ—°μ‚° λͺ…λ Ήμ–΄

 Stream < T > distinct()  Stream의 μš”μ†Œ 쀑볡 제거
 Stream < T > sorted()   Stream μš”μ†Œ μ •λ ¬
 Stream < T > filter(Predicate < T > predicate)  μ‘°κ±΄μ— μΆ©μ‘±ν•˜λŠ” μš”μ†Œλ₯Ό Stream으둜 생성
 Stream < T > limit(long maxSize)  maxSize κΉŒμ§€μ˜ μš”μ†Œλ₯Ό Stream으둜 생성
 Stream < T > skip(ling n)  μ²˜μŒ n개의 μš”μ†Œλ₯Ό μ œμ™Έν•˜λŠ” stream 생성
 Stream < T > peek(Consumer< T > action)  Tνƒ€μž… μš”μ†Œμ— λ§žλŠ” μž‘μ—… μˆ˜ν–‰
 Stream < R > flatMap(Function< T, stream<? extends R>> Tmapper)  Tνƒ€μž… μš”μ†Œλ₯Ό 1:N의 Rνƒ€μž… μš”μ†Œλ‘œ λ³€ν™˜ν•˜μ—¬ 슀트림 생성
 Stream < R > map(Function<? super T, ? extends R> mapper)  μž…λ ₯ Tνƒ€μž…μ„ Rνƒ€μž… μš”μ†Œλ‘œ λ³€ν™˜ν•œ 슀트림 생성
 Stream mapToInt(),mapToLong(),mapToDobule()  λ§Œμ•½ map Type이 μˆ«μžκ°€ μ•„λ‹Œ 경우 λ³€ν™˜ν•˜μ—¬ μ‚¬μš©

 

Stream의 μ΅œμ’… μ—°μ‚° λͺ…λ Ήμ–΄

 void forEach(Consumer <? super T> action)  Stream 의 각 μš”μ†Œμ— μ§€μ •λœ μž‘μ—… μˆ˜ν–‰
 long count()  Stream 의 μš”μ†Œ 개수
 Optional < T > sum (Comparator <? super T> comparator)  Stream 의 μš”μ†Œ ν•©
 Optional < T > max (Comparator <? super T> comparator)  Stream μš”μ†Œμ˜ μ΅œλŒ€ κ°’
 Optional < T > min (Comparator <? super T> comparator)  Stream μš”μ†Œμ˜ μ΅œμ†Œ κ°’
 Optional < T > findAny()  Stream μš”μ†Œμ˜ 랜덀 μš”μ†Œ
 Optional < T > findFirst()  Stream 의 첫 번째 μš”μ†Œ
 boolean allMatch(Pradicate < T > p)  Stream 의 값이 λͺ¨λ‘ λ§Œμ‘±ν•˜λŠ”μ§€ boolean λ°˜ν™˜
 boolean anyMatch(Pradicate < T > p)  Stream 의 값이 ν•˜λ‚˜λΌλ„ λ§Œμ‘±ν•˜λŠ”μ§€ boolean λ°˜ν™˜
 boolean noneMatch(Pradicate < T > p)  Stream 의 값이 ν•˜λ‚˜λΌλ„ λ§Œμ‘±ν•˜μ§€μ•ŠλŠ”μ§€ boolean λ°˜ν™˜ 
 Object[] toArray()  Stream 의 λͺ¨λ“  μš”μ†Œλ₯Ό λ°°μ—΄λ‘œ λ°˜ν™˜
 reduce μ—°μ‚°  Stream 의 μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© 쀄여가며 κ³„μ‚°ν•œλ‹€.
 - Optional < T > reduce(Binary Operator<T> accumulator)
 - T reduce ( T identity, BinaryOperator<T> accumulator)
 - <U> U reduce (U indentity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner)
 - .reduce((x,y) -> x > y ? x : y );
 - .reduce(1, (x,y) -> x * y);
 - .reduce(0.0,
   (val1, val2) -> Double.valueOf(val1 + val2 / 10),
   (val1, val2) -> val1 + val2);
 collector μ—°μ‚°  Stream의 μš”μ†Œλ₯Ό μˆ˜μ§‘ν•˜μ—¬ μš”μ†Œλ₯Ό κ·Έλ£Ήν™” ν•˜κ±°λ‚˜ κ²°κ³Όλ₯Ό λ‹΄μ•„ λ°˜ν™˜ν•˜λŠ”λ° μ‚¬μš©ν•œλ‹€.
 - Collectors.toList()
 - Collectors.toSet()
 - Collectors.toMap()
 - Collectors.groupingBy
 - Collectors.partioningBy
 - Collectors.summarizingInt()

 

 

μ°Έκ³