Skip to content

Latest commit

ย 

History

History
120 lines (96 loc) ยท 6.8 KB

README.md

File metadata and controls

120 lines (96 loc) ยท 6.8 KB

Lambda & Stream

Java 8๋ถ€ํ„ฐ Lambda์‹์ด ๋„์ž…๋˜์—ˆ๊ณ  Stream์ด๋ผ๋Š” API๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
Labmda๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ Collection์˜ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ„๋‹จ๋ช…๋ฃŒํ•ด์กŒ๊ณ , Stream์„ ํ†ตํ•ด ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ ์—†์ด ๋ฐ์ดํ„ฐ Collection์˜ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Lambda

Lambda ํ‘œํ˜„์‹์ด๋ž€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ™”์‚ดํ‘œ(->), {๋ชธํ†ต} ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
๊ธฐ์กด์— ์ต๋ช…ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•˜๋˜ ์ฝ”๋“œ๋ฅผ ์ค„์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ  ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋‚จ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ต๋ช…ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊น…์ด ์–ด๋ ต๊ณ  ์žฌ๊ท€ ํ™œ์šฉ์ด ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค.

์ž๋ฐ”์˜ ๋žŒ๋‹ค ํ‘œํ˜„์‹์€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ž€ 1๊ฐœ์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค ๊ฒ€์ฆ๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด @FunctionalInterface ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค Descripter Method
Predicate T -> boolean boolean test(T t)
Consumer T -> void void accept(T t)
Supplier () -> T T get()
Function<T, R> T -> R R apply(T t)
Comparator (T, T) -> int int compare(T o1, T o2)
Runnable () -> void void run()
Callable () -> T V call()
๐Ÿ’ก ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ์™€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ๊ตฌ๋ฌธ์˜ ๊ด€์‹ฌ์—์„œ ์—ฐ์‚ฐ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ์ง€ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
      โ”œโ”€ ์ ˆ์ฐจ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
      โ””โ”€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๐Ÿ’ก ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ์ง€ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
      โ””โ”€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
โœ… ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
ํ•˜๋“œ์›จ์–ด ๋ฐœ์ „๊ณผ ํ•จ๊ป˜ ์†Œํ”„ํŠธ์›จ์–ด ํŒจ๋Ÿฌ๋‹ค์ž„์€ Text ๊ธฐ๋ฐ˜์˜ ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ -> GUI ๊ธฐ๋ฐ˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ -> ๋ฉ€ํ‹ฐ์ฝ”์–ด ๊ธฐ๋ฐ˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๋ณ€ํ™”ํ•ด์™”์Šต๋‹ˆ๋‹ค.
๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฉ€ํ‹ฐ์ฝ”์–ด๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋„์ž…์ด ํ•„์š”ํ•ด์ ธ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ํ•„์—ฐ์ ์œผ๋กœ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ํ•จ์ˆ˜๋ฅผ 1๊ธ‰ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ์„ ์ˆ˜ํ•™์  ํ•จ์ˆ˜์˜ ์กฐํ•ฉ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
1๊ธ‰ ๊ฐ์ฒด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
- ๋ณ€์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์•ˆ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด
- ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅ
- ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
- ํ• ๋‹น์— ์‚ฌ์šฉ๋œ ์ด๋ฆ„๊ณผ ๊ด€๊ณ„์—†์ด ๊ณ ์œ ํ•œ ๊ตฌ๋ณ„ ๊ฐ€๋Šฅ
- ๋™์ ์œผ๋กœ ํ”„๋กœํผํ‹ฐ ํ• ๋‹น ๊ฐ€๋Šฅ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋Š” ๊ฐ™์€ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง€๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ์ถœ๋ ฅ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
๋˜ ๋ช…๋ นํ˜• ํ๋ฆ„ ์ œ์–ด๋ณด๋‹ค ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ๋‘˜ ์ด์ƒ์˜ ํ•จ์ˆ˜๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ํ•ฉ์„ฑ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ex) ๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹

Stream

Stream์ด๋ž€ ์„ ์–ธํ˜•์œผ๋กœ ๋ฐ์ดํ„ฐ Collection์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” API์ž…๋‹ˆ๋‹ค.
Lambda์‹์„ ์ง€์›ํ•˜๋ฉฐ ์ค‘๊ฐ„ ์—ฐ์‚ฐ(filter, map...)๊ณผ ์ตœ์ข…์—ฐ์‚ฐ(foreach, count, collect...)์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ ์—ฐ์‚ฐ์„ ์กฐ๋ฆฝํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

// Java 8 ์ด์ „
Iterator<String> iter = items.iterator();
while(iter.hasNext()) {
	if(iter.next()!=null){
		System.out.println(iter.next());
	}
}
// Java 8 ์ดํ›„
Stream<String> stream = list.stream();
stream.filter(item->item!=null).forEach(item -> System.out.println(item));

๋ถ„ํ• ์ด ์ž˜ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๊ฑฐ๋‚˜, ์—ฐ์‚ฐ ์ž‘์—…์ด ๋…๋ฆฝ์ ์ด๋ฉด์„œ CPU ์‚ฌ์šฉ๋ฅ ์ด ๋†’์€ ์ž‘์—…์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ Parallel()์€ ๊ณต์œ ๋œ thread pool์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์žฅ์• ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์–ด์„œ ์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โœ… Collection vs Stream
๐Ÿ’ก Collection
๋ชจ๋“  ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ์™ธ๋ถ€ ๋ฐ˜๋ณต์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์—… ๋ฐ˜๋ณต ์ž‘์—…์„ ๊ฑฐ์ณ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (for-each๋ฌธ)
Collection์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ์ด ์™„๋ฃŒ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์™ธ๋ถ€ ๋ฐ˜๋ณต์€ ๋ช…์‹œ์ ์œผ๋กœ Collection ํ•ญ๋ชฉ์„ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ํ™”์—๋Š” ๋ถˆ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
Collection์—์„œ ๋ณ‘๋ ฌ์„ฑ์„ ์ด์šฉํ•˜๋ ค๋ฉด ์ง์ ‘ synchronized ๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ’ก Stream
์š”์ฒญํ•  ๋•Œ๋งŒ ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋‚ด๋ถ€ ๋ฐ˜๋ณต์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ถ”์ถœ ์š”์†Œ๋งŒ ์„ ์–ธํ•ด์ฃผ๋ฉด ์•Œ์•„์„œ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋‚ด๋ถ€ ๋ฐ˜๋ณต์€ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.
์ŠคํŠธ๋ฆผ์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€, ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—…์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽˆ Collection์€ ์Œ์•… ํŒŒ์ผ์„ ์ €์žฅํ•˜์—ฌ ์žฌ์ƒํ•˜๋Š” ํ”Œ๋ ˆ์ด์–ด๋ผ๋ฉด, Stream์€ ํ•„์š”ํ•  ๋•Œ ๊ฒ€์ƒ‰ํ•ด์„œ ๋“ฃ๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ค‘๊ฐ„ ์—ฐ์‚ฐ

ํŒŒ์ดํ”„๋ผ์ด๋‹์ด ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ์œผ๋กœ ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

filter(Predicate) // Predicate๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ true์ธ ์š”์†Œ๋ฅผ ํฌํ•จํ•œ ์ŠคํŠธ๋ฆผ ๋ฐ˜ํ™˜
distinct() // ์ค‘๋ณต ํ•„ํ„ฐ๋ง
limit(n) // ์ฃผ์–ด์ง„ ์‚ฌ์ด์ฆˆ ์ดํ•˜ ํฌ๊ธฐ๋ฅผ ๊ฐ–๋Š” ์ŠคํŠธ๋ฆผ ๋ฐ˜ํ™˜
skip(n) // ์ฒ˜์Œ ์š”์†Œ n๊ฐœ ์ œ์™ธํ•œ ์ŠคํŠธ๋ฆผ ๋ฐ˜ํ™˜
map(Function) // ๋งคํ•‘ ํ•จ์ˆ˜์˜ result๋กœ ๊ตฌ์„ฑ๋œ ์ŠคํŠธ๋ฆผ ๋ฐ˜ํ™˜
flatMap() // ์ŠคํŠธ๋ฆผ์˜ ์ฝ˜ํ…์ธ ๋กœ ๋งคํ•‘ํ•จ. map๊ณผ ๋‹ฌ๋ฆฌ ํ‰๋ฉดํ™”๋œ ์ŠคํŠธ๋ฆผ ๋ฐ˜ํ™˜

์ตœ์ข… ์—ฐ์‚ฐ

์ŠคํŠธ๋ฆผ์„ ๋‹ซ๋Š” ์—ฐ์‚ฐ์œผ๋กœ ์ค‘๊ฐ„ ์—ฐ์‚ฐ ๊ฐ’์„ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

(boolean) allMatch(Predicate) // ๋ชจ๋“  ์ŠคํŠธ๋ฆผ ์š”์†Œ๊ฐ€ Predicate์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์‚ฌ
(boolean) anyMatch(Predicate) // ํ•˜๋‚˜๋ผ๋„ ์ผ์น˜ํ•˜๋Š” ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ
(boolean) noneMatch(Predicate) // ๋งค์น˜๋˜๋Š” ์š”์†Œ๊ฐ€ ์—†๋Š”์ง€ ๊ฒ€์‚ฌ
(Optional) findAny() // ํ˜„์žฌ ์ŠคํŠธ๋ฆผ์—์„œ ์ž„์˜์˜ ์š”์†Œ ๋ฐ˜ํ™˜
(Optional) findFirst() // ์ŠคํŠธ๋ฆผ์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ
reduce() // ๋ชจ๋“  ์ŠคํŠธ๋ฆผ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•ด ๊ฐ’์„ ๋„์ถœ. ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๊ฐ€์ง
collect() // ์ŠคํŠธ๋ฆผ์„ reduceํ•˜์—ฌ list, map, ์ •์ˆ˜ ํ˜•์‹ ์ปฌ๋ ‰์…˜์„ ๋งŒ๋“ฌ
(void) forEach() // ์ŠคํŠธ๋ฆผ ๊ฐ ์š”์†Œ๋ฅผ ์†Œ๋น„ํ•˜๋ฉฐ ๋žŒ๋‹ค ์ ์šฉ
(Long) count // ์ŠคํŠธ๋ฆผ ์š”์†Œ ๊ฐœ์ˆ˜ ๋ฐ˜ํ™˜