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

2022. 6. 6. 19:59ใ†JAVA/์ž๋ฐ”์˜ ์ •์„

728x90

 

https://hyejin.tistory.com/604

 

[JAVA] 23. ๋ฉ”์„œ๋“œ ์ฐธ์กฐ, ์ŠคํŠธ๋ฆผ(Stream)

1๏ธโƒฃ ๋ฉ”์„œ๋“œ ์ฐธ์กฐ ๋žŒ๋‹ค์‹์—์„œ ๋žŒ๋‹ค์‹์ด ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋งŒ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” '๋ฉ”์„œ๋“œ ์ฐธ์กฐ(method reference)'๋ผ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋žŒ๋‹ค์‹์„ ๊ฐ„๋žตํžˆ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋ž˜์Šค์ด๋ฆ„::๋ฉ”์„œ๋“œ์ด๋ฆ„ -> Function ์ธํ„ฐํŽ˜์ด

hyejin.tistory.com

 

1๏ธโƒฃ ์ŠคํŠธ๋ฆผ์˜ ์ค‘๊ฐ„์—ฐ์‚ฐ 

 

- ์ŠคํŠธ๋ฆผ ์ž๋ฅด๊ธฐ skip(), limit() 

skip()๊ณผ limt()์€ ์ŠคํŠธ๋ฆผ์˜ ์ผ๋ถ€๋ฅผ ์ž˜๋ผ๋‚ผ ๋•Œ ์‚ฌ์šฉ

skip(3)์€ ์ฒ˜์Œ 3๊ฐœ์˜ ์š”์†Œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ , limit(5)์€ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ 5๊ฐœ๋กœ ์ œํ•œํ•œ๋‹ค. 

 

- ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ ๊ฑธ๋Ÿฌ๋‚ด๊ธฐ filter(), distinct() 

distinct() ๋Š” ์ŠคํŠธ๋ฆผ์—์„œ ์ค‘๋ณต๋œ ์š”์†Œ๋“ค์„ ์ œ๊ฑฐํ•˜๊ณ , filter()๋Š” ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋งž์ง€ ์•Š๋Š” ์š”์†Œ๋ฅผ ๊ฑธ๋Ÿฌ๋‚ธ๋‹ค. 

-> filter()๋Š” ๋‹ค๋ฅธ ์กฐ๊ฑด์œผ๋กœ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

 

 

- ์ •๋ ฌ sorted()

sorted() ๋Š” ์ง€์ •๋œ Comparator๋กœ ์ŠคํŠธ๋ฆผ์„ ์ •๋ ฌํ•˜๋Š”๋ฐ, Compartor๋Œ€์‹  int ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. 

Compartor๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ŠคํŠธ๋ฆผ ์š”์†Œ์˜ ๊ธฐ๋ณธ ์ •๋ ฌ ๊ธฐ์ค€Comparable์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. 

์ด๋•Œ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๊ฐ€ Comparable์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ์ •๋ ฌ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” thenComparing()์„ ์‚ฌ์šฉํ•œ๋‹ค. 

ํ•™์ƒ์˜ ์„ฑ์  ์ •๋ณด๋ฅผ ์š”์†Œ๋กœ ํ•˜๋Š” Stream<Student> ์„ ๋ฐ˜๋ณ„๋กœ ์ •๋ ฌํ•œ ๋‹ค์Œ์—, ์ด์ ๋ณ„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. 

 

 

 

- ๋ณ€ํ™˜ map()

์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ์— ์ €์žฅ๋œ ๊ฐ’ ์ค‘์—์„œ ์›ํ•˜๋Š” ํ•„๋“œ๋งŒ ๋ฝ‘์•„๋‚ด๊ฑฐ๋‚˜ ํŠน์ • ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ map()์ด๋‹ค. 

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Tํƒ€์ž…์„ Rํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. 

map() ์—ญ์‹œ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์ด๋ฏ€๋กœ, ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋Š” String์„ ์š”์†Œ๋กœ ํ•˜๋Š” ์ŠคํŠธ๋ฆผ์ด๋‹ค. map()์œผ๋กœ Stream<File> ์„ Stream<String>์œผ๋กœ ๋ณ€ํ™˜ํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

map()๋„ filter() ์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์— ์—ฌ๋Ÿฌ๋ฒˆ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

- ์กฐํšŒ peek()

์—ฐ์‚ฐ๊ณผ ์—ฐ์‚ฐ ์‚ฌ์ด์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, peek()์„ ์‚ฌ์šฉํ•˜์ž. 

peek()๋Š” ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์†Œ๋ชจํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—ฐ์‚ฐ ์‚ฌ์ด์— ์—ฌ๋Ÿฌ ๋ฒˆ ๋ผ์›Œ ๋„ฃ์–ด๋„ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค. 

 

 

 

- flapMap() : Stream<T[]> ๋ฅผ Stream<T>๋กœ ๋ณ€ํ™˜

์ŠคํŠธ๋ฆผ์˜ ์ŠคํŠธ๋ฆผ -> ์ŠคํŠธ๋ฆผ 

์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๊ฐ€ ๋ฐฐ์—ด์ด๊ฑฐ๋‚˜ map()์˜ ์—ฐ์‚ฐ๊ฒฐ๊ณผ๊ฐ€ ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ, ์ฆ‰ ์ŠคํŠธ๋ฆผ์˜ ํƒ€์ž…์ด Stream<T[]> ์ธ ๊ฒฝ์šฐ, Stream<T>๋กœ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋” ํŽธ๋ฆฌํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. 

๊ทธ๋Ÿด ๋•Œ๋Š” map()๋Œ€์‹  flatMap()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. 

-> ์—ฌ๋Ÿฌ ๋ฌธ์žฅ์„ ์š”์†Œ๋กœ ํ•˜๋Š” ์ŠคํŠธ๋ฆผ์ด ์žˆ์„ ๋•Œ, ์ด ๋ฌธ์žฅ๋“ค์„ split()์œผ๋กœ ๋‚˜๋ˆ ์„œ ์š”์†Œ๊ฐ€ ๋‹จ์–ด์ธ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ flatMap()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. 

flatMap()์€ ์ŠคํŠธ๋ฆผ์˜ ์ŠคํŠธ๋ฆผ์„ ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ํ•ฉ์น  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. 

 

 

2๏ธโƒฃ Optional<T>

Optional<T>๋Š” ์ง€๋„ค๋ฆญ ํด๋ž˜์Šค๋กœ Tํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ์‹ธ๋Š” ๋ž˜ํผ ํด๋ž˜์Šค์ด๋‹ค. 

Optionalํƒ€์ž…์˜ ๊ฐ์ฒด์—๋Š” ๋ชจ๋“  ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค. 

์ตœ์ข… ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ƒฅ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Optional ๊ฐ์ฒด์— ๋‹ด์•„์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

์ด์ฒ˜๋Ÿผ ๊ฐ์ฒด์— ๋‹ด์•„์„œ ๋ฐ˜ํ™˜์„ใ…‡ ํ•˜๋ฉด, ๋ฐ˜ํ™˜๋œ ๊ฒฐ๊ณผ๊ฐ€ null์ธ์ง€ ๋งค๋ฒˆ if๋ฌธ์œผ๋กœ ์ฒดํฌํ•˜๋Š” ๋Œ€์‹  Optional์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๊ฐ„๋‹จํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

- Optional ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ 

Optional ๊ฐ์ฒด๋ฅผ์ƒ์„ฑํ•  ๋•Œ๋Š” of() ๋˜๋Š” ofNullable() ์„ ์‚ฌ์šฉํ•œ๋‹ค. 

๋งŒ์ผ ์ฐธ์กฐ๋ณ€์ˆ˜์˜ ๊ฐ’์ด Null์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฉด, of() ๋Œ€์‹  ofNullable()์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

of()๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์ด null์ด๋ฉด NPE ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  Optional<T> ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ• ๋•Œ๋Š” empty()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

null๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, empty()๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค. 

 

 

- Optioanl ๊ฐ์ฒด์˜ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ 

Optional ๊ฐ์ฒด์— ์ €์žฅ๋œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” get()์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฐ’์ด null์ผ ๋•Œ๋Š” NoSuchElementException์ด ๋ฐœ์ƒํ•˜๋ฉฐ ์ด๋ฅผ ๋Œ€๋น„ํ•ด์„œ orElse()๋กœ ๋Œ€์ฒดํ•  ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

orElse()์˜ ๋ณ€ํ˜•์œผ๋กœ๋Š” null์„ ๋Œ€์ฒดํ•  ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋žŒ๋‹ค์‹์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” orElseGet()๊ณผ null์ผ ๋•Œ ์ง€์ •๋œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” orElseThrow() ๊ฐ€ ์žˆ๋‹ค. 

- isPresent()

Optional() ๊ฐ์ฒด์˜ ๊ฐ’์ด null์ด๋ฉด false, ์•„๋‹ˆ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ifPresent()๋Š” ๊ฐ’์ด ์žˆ์œผ๋ฉด ์ฃผ์–ด์ง„ ๋žŒ๋‹ค์‹์„ ์‹คํ–‰ํ•˜๊ณ  ์—†์œผ๋ฉด ์•„๋ฌด์ผ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. 

 

- OptionalInt, OptionalLong, OptionalDouble

Optional<T>๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ, Optional์—ญ์‹œ ํ•œ๋ฒˆ ๋” ๊ฐ์‹ธ์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์€ ์•ˆ์ข‹์€ ํŽธ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ์„ ์กฐ๊ธˆ์ด๋ผ๋„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ OptionalInt, OptionalLong ๋“ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90