๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’Ž/Java

[Java] ์ŠคํŠธ๋ฆผ Stream

by dar0m! 2021. 7. 28.

๊ฐœ๋…

์ŠคํŠธ๋ฆผ์€ ๋ฐ˜๋ณต์ž

์ŠคํŠธ๋ฆผ์€ ์ปฌ๋ ‰์…˜(๋ฐฐ์—ด ํฌํ•จ)์˜ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ฐธ์กฐํ•ด์„œ ๋žŒ๋‹ค์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ณต์ž์ด๋‹ค.

๋žŒ๋‹ค์‹, ์ŠคํŠธ๋ฆผ ๋‘˜ ๋‹ค ์ž๋ฐ” 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()

 

 

์ฐธ๊ณ 

๋Œ“๊ธ€