๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“š์ฝ์€ ์ฑ… ์ •๋ฆฌ/์ž๋ฐ” ๋งˆ์Šคํ„ฐ๋ถ

[์ž๋ฐ” ๋งˆ์Šคํ„ฐ๋ถ] 1์žฅ๋ถ€ํ„ฐ 5์žฅ.. ๋žŒ๋‹ค์‹๊ณผ Stream API๊นŒ์ง€.

1.1 ์ž๋ฐ”๋ž€?

1.1.1 ์ž๋ฐ”์˜ ํŠน์ง•

  • ๊ฐ์ฒด ์ง€ํ–ฅ
    • ํด๋ž˜์Šค์™€ ์ƒ์† ๊ตฌ์กฐ๋ฅผ ํ™”์šฉํ•˜์—ฌ ํ™•์žฅ์„ฑ์ด ์šฐ์ˆ˜ํ•˜๋ฉฐ ์žฌํ•˜์šฉํ•˜๊ธฐ ์‰ฌ์šด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•จ.
  • ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ
    • ํ”„๋กœ๊ทธ๋žจ์ด ์ž๋ฐ” ๊ฐ€์ƒ๋จธ์‹ ์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ ์ž์ฒด๋Š” ์šด์˜์ฒด์ œ์— ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Œ.
  • ๋›ฐ์–ด๋‚œ ์—์ฝ” ์‹œ์Šคํ…œ
    • ์šฐ์ˆ˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๋ฏธ๋“ค์›จ์–ด(DBMS ๋“ฑ)๊ฐ€ ๋‹ค์ˆ˜ ์กด์žฌํ•จ์œผ๋กœ ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

1.1.3 ์ž๋ฐ”๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ

์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ๊นŒ์ง€์˜ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ํ๋ฆ„ ์„ค๋ช…

1. ์ž๋ฐ”์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ

2. javac ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  `ํด๋ž˜์Šค ํŒŒ์ผ`์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ค‘๊ฐ„์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

3. javac ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ java vm์ด ํด๋ž˜์Šค ํŒŒ์ผ์„ ํ•ด์„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

2.4 ๋ช…๋ช… ๊ทœ์น™

2.4.1 ํด๋ž˜์Šค์™€ ๋ณ€์ˆ˜๋Š” '์นด๋ฉœ ์ผ€์ด์Šค', ์ƒ์ˆ˜๋Š” ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค(_)

  • ๊ทธ ์ค‘์—์„œ๋„ ํด๋ž˜์Šค๋ช…์€ ์„ ๋‘ ๋ฌธ์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœํ•˜๋Š” 'ํŒŒ์Šค์นผ ์ผ€์ด์Šค'๋กœ ํ•œ๋‹ค.

๋ณ€์ˆ˜๋ช… ๋’ค์—๋Š” '_'์„ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค.

๋ณ€์ˆ˜๋Š” ๋ช…์‚ฌ - ๋ฉ”์„œ๋“œ๋Š” ๋™์‚ฌ๋กœ ๋ช…๋ช…ํ•œ๋‹ค.

์ด๋ฅผ ์–ด๊ธฐ๊ธฐ ์‰ฌ์šด ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ ๋ฐ”๋กœ 'boolean'์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. 'is???'๋ผ๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ ๋™์‚ฌํ˜•ํƒœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป๋œ ๋ช…๋ช…์— ํ•ด๋‹นํ•œ๋‹ค. ๋ฉ”์„œ๋“œ์—๋งŒ isStarted ์ด๋Ÿฐ ์‹์˜ ๋ช…๋ช…์„ ์‚ฌ์šฉํ•˜์ž. boolean ํ•„๋“œ ๋ณ€์ˆ˜์—๋Š” started๋ผ๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

'๋ถˆ๊ธธํ•œ ๋ƒ„์ƒˆ'๊ฐ€ ๋‚˜๋Š” ์ด๋ฆ„์„ ์ฃผ์˜ํ•˜์ž.

์—ญํ• ์ด ์• ๋งคํ•˜๊ฑฐ๋‚˜ ๋งŽ์€ ์—ญํ• ์„ ์ง€๋‹ˆ๊ณ  ์žˆ๋Š” ๋‚˜๋จธ์ง€ ๋น„๋Œ€ํ™”๋œ ํด๋ž˜์Šค๊ฐ€ ์ด ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•œ๋‹ค.

๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ์„ ํฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฆ„์€ ์ข‹์ง€ ์•Š๋‹ค. ์—ญํ• ์„ ๋” ๋‹จ์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ช…์ด ์—†๋Š”์ง€ ๊ณ ๋ฏผํ•ด๋ณด์ž.

3.1 ๊ธฐ๋ณธํ˜•๊ณผ ์ฐธ์กฐํ˜•

3.1.5 ๋ž˜ํผ ํด๋ž˜์Šค

๊ธฐ๋ณธํ˜•์€ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹จ์ˆœํ•œ ๊ฐ’์ด๋ฉฐ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค. 

๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ๊ทธ๋žจ ์•ˆ์—์„œ๋Š” ๊ธฐ๋ณธํ˜• ๊ฐ’์— ๋Œ€ํ•ด ์กฐ์ž‘์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์ด ๋งŽ์ด ์žˆ๋‹ค. ์ด ๋•Œ ์ž๋ฐ”๋Š” ๊ธฐ๋ณธํ˜•์˜ '๋ž˜ํผ ํด๋ž˜์Šค'๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

 

int์˜ ์„ ์–ธ ํ›„ ์ดˆ๊ธฐ ๊ฐ’์€ 0์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Integer์˜ ์„ ์–ธํ›„ ์ดˆ๊ธฐ๊ฐ’์€ null์ด๋ผ๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ฐจ์ด๋ฅผ ์œ ์šฉํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ ๋ฐ”๋กœ 'ํ†ต์‹ '์ด๋‹ค.

 

HTTP ํ†ต์‹ ์œผ๋กœ ์ทจ๋“ํ•œ ๊ฐ’์ด๋‹ค ์„ค์ •ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ฝ์–ด๋“ค์ธ ๊ฐ’์„ ์ทจ๋“ํ•˜์—ฌ ์ง€์ •ํ•˜๊ณ  ์ทจ๋“ํ•˜์ง€ ๋ชปํ•˜๋ฉด null๋กœ ๋‘๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ด๋•Œ intํ˜•์€ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ 0์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ๊ฐ’์ด 0์ธ ๊ฒƒ์ธ์ง€ ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฐ’์ธ์ง€ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์—†๋‹ค.

ํ•˜์ง€๋งŒ '๋ž˜ํผ ํด๋ž˜์Šค'๋Š” ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์œผ๋ฉด null์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์ฐจ์ด๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํ†ต์‹ , ํŒŒ์ผ ๋“ฑ์œผ๋กœ ๋ถ€ํ„ฐ ์ฝ์–ด๋“ค์ธ ๋ณ€์ˆ˜๋Š” ๋ž˜ํผํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

5.  ๋žŒ๋‹ค์‹๊ณผ Stream API

Stream API์—๋Š” `์ž‘์„ฑ` -> `์ค‘๊ฐ„ ์ž‘์—…` -> `์ค‘๊ฐ„์ž‘์—…` -> .. .. -> `์ข…๋ฃŒ ์ž‘์—…` ์ˆœ์„œ์˜ ์„ธ ๊ฐ€์ง€ ์ž‘์—…์ด ์กด์žฌ.\

 

5.1.2๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•ด๋ณด์ž.

sort()๋ฅผ ์œ„ํ•ด Comparator์ธํ„ฐํŽ˜์ด์Šค์˜ compare ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๊ธฐ์กด์—๋Š” ์ต๋ช…ํด๋ž˜์Šค๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•ด์•ผ๋งŒ ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ž๋ฐ” 8์—์„œ๋Š” ์ด๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ () -> {} ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋Š” `์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์„ ์–ธ์„ ๊ฑธ์ณ์„œ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  "์ฒ˜๋ฆฌ์˜ ๋‚ด์šฉ๋งŒ ๋‚˜ํƒ€๋‚ด๋Š” ์‹"๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.`๋ผ๋Š” ํŠน์„ฑ์ด๋‹ค.

์ด๊ฒƒ์˜ ํšจ๊ณผ๋กœ Stream API์™€ ์กฐํ•ฉํ–ˆ์„ ๋•Œ ์ฝ”๋“œ๋ฅผ ๋”์šฑ ์•Œ๊ธฐ ์‰ฝ๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.

 

5.1.3 ๋ฉ”์„œ๋“œ ์ฐธ์กฐ (๋ฉ”์„œ๋“œ ๋ ˆํผ๋Ÿฐ์Šค)

๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋Š” '๋Œ€์ž…ํ•  ๊ณณ์˜ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์— ์žˆ๋Š” ์ธ์ˆ˜์˜ ์ˆ˜์™€ ํƒ€์ž…์ด ์ผ์น˜ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋ฉ”์„œ๋“œ๋ฅผ ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค' ๋ผ๋Š” ๊ทœ์น™์ด๋‹ค.

์ธ์ž๋กœ [์ธ์ˆ˜์˜ ์ˆ˜์™€ ํƒ€์ž…์ด ์ผ์น˜ํ•˜๋‹ค๋ฉด] ์‚ฌ์šฉ๊ฐ€๋Šฅ..!

 

5.2.3 Map์œผ๋กœ๋ถ€ํ„ฐ Stream ์ž‘์„ฑํ•˜๊ธฐ (feat. Entry)

Set<Map.Entry<String, String>> entries = myMap.entrySet();
Stream<Map.Entry<String, String>> stream = entries.stream();
stream.forEach(e-> System.out.println("KEY : " + e.getKey() + " Value : " + e.getValue()));

Map์€ ๋‚ด๋ถ€์˜ Entry๊ฐ์ฒด๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋ฅผ Setํ˜•ํƒœ๋กœ ๊บผ๋‚ด์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฐ๊ฐ key, value๋กœ ๋‚˜๋ˆ ์„œ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ stream์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์ถœ๋ ฅ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

Set<String> strings = myMap.keySet();
Collection<String> values = myMap.values();

์ถ”๊ฐ€์ ์œผ๋กœ Map์€ key๋Š” Setํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  value๋Š” Collection ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

5.2.4 ์ˆซ์ž ๋ฒ”์œ„๋กœ๋ถ€ํ„ฐ Stream ์ž‘์„ฑํ•˜๊ธฐ

์ปฌ๋ ‰์…˜์ด๋‚˜ ๋ฐฐ์—ด, Map๊ฐ™์€ ๊ฐ์ฒด ๋ง๊ณ ๋„ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒํ•œ ์ˆซ์ž๊ฐ’์œผ๋กœ๋„ Stream์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์ข…๋ฅ˜์—๋Š” IntStream, LongStream, DoubleStream ๋“ฑ์ด ์žˆ๋‹ค.

IntStream stream = IntStream.range(1, 5); // 1~4๊นŒ์ง€ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ.
Stream.forEach(System.out::println);

5.3.1 ์š”์†Œ๋ฅผ ์น˜ํ™˜ํ•˜๋Š” ์ค‘๊ฐ„ ์ž‘์—…

๋ฉ”์„œ๋“œ๋ช… ์ฒ˜๋ฆฌ๋‚ด์šฉ ์ธ์ˆ˜ ๋ฐ˜ํ™˜๊ฐ’
map ์š”์†Œ๋ฅผ ๋ณ„๋„์˜ ๊ฐ’์œผ๋กœ ์น˜ํ™˜ Function(์ธ์ˆ˜ Stream, ๋ฐ˜ํ™˜๊ฐ’ ์ž„์˜์˜ ํƒ€์ž…) Stream<๋ณ€ํ™˜ ํ›„์˜ ํƒ€์ž…>
mapToInt ์š”์†Œ๋ฅผ int๊ฐ’์œผ๋กœ ์น˜ํ™˜ Function(์ธ์ˆ˜ Stream, ๋ฐ˜ํ™˜๊ฐ’์ด int) IntStream
mapToDouble ์š”์†Œ๋ฅผ double๊ฐ’์œผ๋กœ ์น˜ํ™˜ Function(์ธ์ˆ˜ Stream, ๋ฐ˜ํ™˜๊ฐ’์ด double) DoubleStream
...๋‚˜๋จธ์ง€ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ํƒ€์ž…๋“ค..      

mapToInt, mapToDouble์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋‚˜์ค‘์— sum, avg์™€ ๊ฐ™์ด ์ˆ˜์น˜ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

# flatMap ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

flatMap์€ Stream์„ ๊ฒฐํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ Stream์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

๋งŒ์•ฝ, map๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์ด '์ปฌ๋ ‰์…˜' ์ด๋‚˜ '๋ฐฐ์—ด'์ด ๋  ๊ฒฝ์šฐ '๊ฐœ๋ณ„์  ์ปฌ๋ ‰์…˜'์„ ์ทจ๊ธ‰ํ•˜๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ flatMap์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๊ฒƒ๋“ค์„ ํ•˜๋‚˜์˜ Stream์œผ๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

        class Node{
            private List<String> listString;

            public Node() {
                listString = new ArrayList<>();
            }

            public List<String> getListString() {
                return listString;
            }
        }
        List<Node> listNode = new ArrayList<>();
        
        // ์ผ๋ฐ˜์ ์ธ ๋งต ์‚ฌ์šฉ์‹œ List์˜ Stream์„ ๋ฐ˜ํ™˜
        Stream<List<String>> listStream = listNode.stream().map(list -> list.getListString());
        
        // flatMap์‚ฌ์šฉ ์‹œ flatํ•œ String์˜ Stream์„ ๋ฐ˜ํ™˜
        Stream<String> stringStream = listNode.stream().flatMap(list -> list.getListString().stream());

flatMap์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปฌ๋ ‰์…˜์—์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ’์„ ๊บผ๋‚ด์˜ค๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ ์„œ ๋ฐ”๋กœ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

5.3.2/3 ์š”์†Œ๋ฅผ ๊ฑธ๋Ÿฌ๋‚ด๊ณ  ์ •๋ ฌํ•˜๋Š” ์ค‘๊ฐ„ ์ž‘์—…๋“ค

filter, limit, distinct ๋ฅผ ํ†ตํ•ด ์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ๋“ค๋งŒ ๊ฑธ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

์š”์†Œ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” sorted ๋ฉ”์„œ๋“œ์ด๋‹ค. Comparator๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

Compartor์˜ ๋ฐ˜ํ™˜๊ฐ’์ด..

0๋ณด๋‹ค ์ž‘์€ ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ -> ์ธ์ˆ˜ 1์˜ ๊ฐ์ฒด๊ฐ€ ์•ž์— ๋ฐฐ์น˜๋œ๋‹ค. (๋‚ด๋ฆผ์ฐจ์ˆœ)

0๋ณด๋‹ค ํฐ ์–‘์ˆ˜์ธ ๊ฒฝ์šฐ    -> ์ธ์ˆ˜ 2์˜ ๊ฐ์ฒด๊ฐ€ ์•ž์— ๋ฐฐ์น˜๋œ๋‹ค. (์˜ค๋ฆ„์ฐจ์ˆœ)

0์ธ ๊ฒฝ์šฐ -> ์ˆœ์„œ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. (๊ทธ๋Œ€๋กœ)

5.4 Stream์— ๋Œ€ํ•œ '์ข…๋ฃŒ ์ž‘์—…'

* ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ๋ฅผ ์‹ค์‹œํ•˜๋Š” ์ข…๋ฃŒ์ž‘์—…

forEach๋Š” ์ธ์ˆ˜๋กœ Consumer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ๋ฐ›์•„ ์•ก์…˜๋งŒ ์ทจํ•˜๊ณ  ๋ฆฌํ„ด๊ฐ’์„ ๋Œ๋ ค์ฃผ์ง€ ์•Š๋Š”๋‹ค.

 

* ๊ฒฐ๊ณผ๋ฅผ ์ •๋ฆฌํ•ด์„œ ์ถ”์ถœํ•˜๋Š” ์ข…๋ฃŒ์ž‘์—…

 

collect๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ์Šค์บ๋‹ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์•„์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

```์˜ˆ์‹œ ์ฝ”๋“œ

.collect(Collectors.toList());

.collect(Collectors.joining(","));

 

.groupingBy(Student::getScore)); ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด

๊ฐ’์„ ํ‚ค๋กœ ๊ฐ€์ง€๊ณ  ํ•™์ƒ๋“ค์„ ๊ฐ’์„ ๊ฐ€์ง€๋Š” Mapํ˜•ํƒœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

```

 

toArray๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

reduce๋Š” ๊ฐ’์„ ์ง‘์•ฝํ•œ๋‹ค.

 

5.4.4 ์ง‘๊ณ„ ์ฒ˜๋ฆฌ๋ฅผ ์‹ค์‹œํ•˜๋Š” ์ข…๋ฃŒ ์ž‘์—…

count, min, max, sum, average ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ count๋ฉ”์„œ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ  Optional ๋ฐ˜ํ™˜๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

 

5.5.3 List๋‚˜ Map์— ๋Œ€ํ•œ ํšจ์œจ์ ์ธ ์ฒ˜๋ฆฌ

removeIf๋ฅผ ํ™œ์šฉํ•ด์„œ Stream์ธ์Šคํ„ด์Šค ์—†์ด ์›ํ•˜๋Š” ์š”์†Œ๋ฅผ ์ œ๊ฑฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

replaceAll์„ ํ™œ์šฉํ•ด์„œ Stream์ธ์Šคํ„ด์Šค ์—†์ด ๋ชจ๋“  ์š”์†Œ๋ฅผ ์›ํ•˜๋Š” ์š”์†Œ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—‡๋‹ค.

 

5.6 StreamAPI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ List์ดˆ๊ธฐํ™” ํ•˜๊ธฐ.

        IntStream intStream = IntStream.of(1, 512, 123, 52, 23, 12);
        
        Stream<Integer> boxed = IntStream.of(1, 512, 123, 52, 23, 12).boxed();
        
        // collect๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ IntStream์ด ์•„๋‹Œ Stream<>ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋ฏ€๋กœ boxed()๋ฅผ ์‚ฌ์šฉํ•จ.
        List<Integer> collect = boxed.collect(Collectors.toList());

        // ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ.
        Integer[] integers = boxed.toArray(num -> new Integer[num]);

Stream์„ ํ™œ์šฉํ•˜์—ฌ for๋ฌธ ์—†์ด List๋‚˜ ๋ฐฐ์—ดํ˜•ํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.