[JAVA] 25. ์ŠคํŠธ๋ฆผ์˜ ์ตœ์ข… ์—ฐ์‚ฐ (forEach(), reduce(), collect(), groupingBy(), partioningBy()..)

2022. 6. 8. 21:55ใ†JAVA/์ž๋ฐ”์˜ ์ •์„

728x90

https://hyejin.tistory.com/605

 

[JAVA] 24. ์ŠคํŠธ๋ฆผ์˜ ์ค‘๊ฐ„์—ฐ์‚ฐ, Optional<T>, OptionalInt

https://hyejin.tistory.com/604 Function ์ธํ„ฐํŽ˜์ด" data-og-host="hyejin.tistory.com" data-og-source-url="https://hyejin.tistory.com/604" data-og-url="https://hyejin.tistory.com/604" data-og-image="ht..

hyejin.tistory.com

 

 

1๏ธโƒฃ ์ŠคํŠธ๋ฆผ์˜ ์ตœ์ข… ์—ฐ์‚ฐ 

์ตœ์ข… ์—ฐ์‚ฐ์€ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์†Œ๋ชจํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค. ๊ทธ๋ž˜์„œ ์ตœ์ข… ์—ฐ์‚ฐ ํ›„์—๋Š” ์ŠคํŠธ๋ฆผ์ด ๋‹ซํžˆ๊ฒŒ ๋˜๊ณ , ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. 

๋”ฐ๋ผ์„œ ์ตœ์ข… ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋Š” ์ŠคํŠธ๋ฆผ ์š”์†Œ์˜ ํ•ฉ๊ณผ ๊ฐ™์€ ๋‹จ์ผ ๊ฐ’์ด๊ฑฐ๋‚˜, ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด ๋˜๋Š” ์ปฌ๋ ‰์…˜์ผ ์ˆ˜ ์žˆ๋‹ค.

 

- forEach()

forEach()๋Š” peek()๊ณผ ๋‹ฌ๋ฆฌ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์†Œ๋ชจํ•˜๋Š” ์ตœ์ข…์—ฐ์‚ฐ์ด๋‹ค. 

๋ฐ˜ํ™˜ ํƒ€์ž…์ด void์ด๋ฏ€๋กœ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์šฉ๋„๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. 

 

- ์กฐ๊ฑด ๊ฒ€์‚ฌ allMatch(), anyMatch(), noneMatch(), findFirst(), findAny()

์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ์— ๋Œ€ํ•ด ์ง€์ •๋œ ์กฐ๊ฑด์— ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์ง€, ์ผ๋ถ€๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์–ด๋–ค ์š”์†Œ๋„ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋“ค์ด๋‹ค. 

์ด ๋ฉ”์„œ๋“œ๋“ค์€ ๋ชจ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Predicate๋ฅผ ์š”๊ตฌํ•˜๊ณ  ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋กœ boolean์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

์ด์™ธ์—๋„ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ ์ค‘์—์„œ ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” FindFirst()๊ฐ€ ์žˆ๋Š”๋ฐ ์ฃผ๋กœ filter()์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด ์กฐ๊ฑด์— ๋งž๋Š” ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. 

๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์ธ ๊ฒฝ์šฐ์—๋Š” findAny()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

 

- ํ†ต๊ณ„ count(), sum(), average(), max(), min()

 

 

- ๋ฆฌ๋“€์‹ฑ reduce()

reduce()๋Š” ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์ค„์—ฌ๋‚˜๊ฐ€๋ฉด์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

๊ทธ๋ž˜์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์ด BinaryOperator<T>์ด๋‹ค. ์ฒ˜์Œ ๋‘ ์š”์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฐ์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ๊ทธ ๋‹ค์Œ ์š”์†Œ์™€ ์—ฐ์‚ฐํ•œ๋‹ค. 

์ด ๊ณผ์ •์—์„œ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์†Œ๋ชจํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ŠคํŠธ๋ฆผ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์†Œ๋ชจํ•˜๊ฒŒ ๋˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

reduce()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. ๊ทธ์ € ์ดˆ๊ธฐ๊ฐ’(identity)์™€ ์–ด๋–ค ์—ฐ์‚ฐ(BinaryOperator)์œผ๋กœ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์ค„์—ฌ๋‚˜๊ฐˆ ๊ฒƒ์ธ์ง€๋งŒ ๊ฒฐ์ •ํ•˜๋ฉด ๋œ๋‹ค. 

 

 

 

 

2๏ธโƒฃ Collect()

collect()๋Š” ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ์ตœ์ข… ์—ฐ์‚ฐ์œผ๋กœ ์•ž์—์„œ ๋ฐฐ์šด ๋ฆฌ๋“€์‹ฑ reducing๊ณผ ์œ ์‚ฌํ•˜๋‹ค. 

collect()๊ฐ€ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์ˆ˜์ง‘ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ์ˆ˜์ง‘ํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•์ด ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์ปฌ๋ ‰ํ„ฐ Collector์ด๋‹ค. 

collect() : ์ŠคํŠธ๋ฆผ์˜ ์ตœ์ข… ์—ฐ์‚ฐ, ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ปฌ๋ ‰ํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค.
Collector : ์ˆ˜์ง‘์— ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ด ๋†“์€ ์ธํ„ฐํŽ˜์ด์Šค
Collectors : ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์˜ Collector๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค, static๋ฉ”์„œ๋“œ๋กœ ๋ฏธ๋ฆฌ ์ž‘์„ฑ๋œ ์ปฌ๋ ‰ํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. 

 

 

- ์ŠคํŠธ๋ฆผ์„ ์ปฌ๋ ‰์…˜๊ณผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ toList(), toSet(), toMap(), toCollection(), toArray()

์ŠคํŠธ๋ฆผ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ปฌ๋ ‰์…˜์— ์ˆ˜์ง‘ํ•˜๋ ค๋ฉด, Collectorsํด๋ž˜์Šค์˜ toList()์™€ ๊ฐ™์Œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. 

p- p.getRegId() ๋Š” key, p->p๋Š” ํ•ญ๋“ฑํ•จ์ˆ˜๋กœ ์ž…๋ ฅ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ด๋ฅผ value๋กœ ํ•œ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ์ŠคํŠธ๋ฆผ์— ์ €์žฅ๋œ ์š”์†Œ๋“ค์„ T[] ํƒ€์ž…์˜ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด toArray()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. 

๋‹จ, ํ•ด๋‹น ํƒ€์ž…์˜ ์ƒ์„ฑ์ž ์ฐธ์กฐ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค. 

Student[] stuNames = studentStream.toArray(Student[]::new);  -> O 

Object[] stuNams = StudentStream.toArray(); -> O 

Student[] stuNames = StudentStream.toArray(); -> X

 

 

- ํ†ต๊ณ„ counting(), summingInt(), averagingInt(), maxBy(), minBy()

Collectors๋Š” static import๋กœ ์ƒ๋žตํ–ˆ๋‹ค๋Š” ๊ฐ€์ •

 

- ๋ฆฌ๋“€์‹ฑ reducing

 

- ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ joining()

: ๋ฌธ์ž์—ด ์ŠคํŠธ๋ฆผ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ์—ฐ๊ฒฐํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

์ด๋•Œ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๊ฐ€ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” map()์„ ์ด์šฉํ•ด์„œ ๋จผ์ € ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. 

 

 

 

3๏ธโƒฃ  ๊ทธ๋ฃนํ™”์™€ ๋ถ„ํ•  groupingBy(), partitioningBy()

๊ทธ๋ฃนํ™”๋Š” ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ํŠน์ • ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ณ , ๋ถ„ํ• ์€ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ๋‘๊ฐ€์ง€, ์ง€์ •๋œ ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ๊ทธ๋ฃน๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ทธ๋ฃน์œผ๋กœ์˜ ๋ถ„ํ• ์„ ์˜๋ฏธํ•œ๋‹ค. 

groupingBy()๋Š” ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ Function์œผ๋กœ, partitioningBy()๋Š” Predicate๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค. 

์ŠคํŠธ๋ฆผ์„ ๋‘ ๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ ์•ผ ํ•œ๋‹ค๋ฉด partitioningBy()๋กœ ๋ถ„ํ• ํ•˜๋Š”๊ฒƒ์ด ํ›จ์”ฌ ๋น ๋ฅด๋‹ค!

 

 

- partitioningBy()์— ์˜ํ•œ ๋ถ„๋ฅ˜

 

 

 

- groupingBy()์— ์˜ํ•œ ๋ถ„๋ฅ˜

-> ๋งˆ์ง€๋ง‰์—๋Š” ํ•™๋…„๋ณ„๊ณผ ๋ฐ˜๋ณ„๋กœ ๊ทธ๋ฃนํ™”ํ•œ ๋‹ค์Œ์—, ์„ฑ์ ๊ทธ๋ฃน์œผ๋กœ ๋ณ€ํ™˜mappingํ•˜์—ฌ Set์— ์ €์žฅํ•œ๋‹ค. 

 

-> ํ•™๋…„๋ณ„, ๋ฐ˜ ๋ณ„๋กœ ๊ทธ๋ฃนํ™” ํ•œ ๋‹ค์Œ์—, ์„ฑ์  ๊ทธ๋ฃน์œผ๋กœ ๋ณ€ํ™˜mappingํ•˜์—ฌ Set์— ์ €์žฅํ•œ๋‹ค. 

 

 

 

- ์ŠคํŠธ๋ฆผ ๋ณ€ํ™˜ ๋ฉ”์„œ๋“œ 

 

 

728x90