asSequence()

Minsuk Jangยท2021๋…„ 9์›” 5์ผ
0

์ฝ”ํ‹€๋ฆฐ

๋ชฉ๋ก ๋ณด๊ธฐ
2/4
post-thumbnail

๐Ÿค” ๊ธ€์„ ์“ฐ๊ฒŒ ๋œ ๋™๊ธฐ

์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์— ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๋„์ค‘, ์˜คํ”ˆ์ฑ„ํŒ…๋ฐฉ์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ํ’€์ด์— asSequence()๋ฅผ ์ด์šฉํ•œ ๊ฒƒ์„ ๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค.

์ฝ”ํ‹€๋ฆฐ์„ ๊ณต๋ถ€ํ•˜๋Š” ์ž…์žฅ์—์„œ ๋ชจ๋ฅธ ์ฑ„๋กœ ๋„˜์–ด ๊ฐˆ ์ˆ˜ ์—†์–ด ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๐Ÿ‘‰ asSequence()๋ž€?

์šฐ์„ , kotlin์˜ Collections์€ eager evaluation ๋ฐฉ์‹์œผ๋กœ ์—ฐ์‚ฐ์ด ์ง„ํ–‰๋œ๋‹ค.

  • eager evalution์ด๋ž€? ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋Š” ์ˆœ๊ฐ„ ๊ณ„์‚ฐ, ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์—ฐ์‚ฐ์ด ์žˆ์œผ๋ฉด ๋ฏธ๋ฃจ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

Java์˜ Stream์€ lazy evaluation ๋ฐฉ์‹์œผ๋กœ ์—ฐ์‚ฐ์ด ์ง„ํ–‰๋œ๋‹ค.

  • lazy evaluation์€ ๊ณ„์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ’์ด ํ•„์š”ํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์‚ฐ์„ ๋Šฆ์ถ”๋Š” ๊ธฐ๋ฒ•
    ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ์˜ ์ˆ˜ํ–‰์„ ๋ฏธ๋ฃจ๊ณ , ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ์ˆœ๊ฐ„์— ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๊ณผ์ •์€ ๋‹ค๋ฅด์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋‹ค!!.

asSequence()๋Š” Java์˜ stream๊ณผ ๋™์ผํ•˜๊ฒŒ lazy evaluation ๋ฐฉ์‹์œผ๋กœ ์—ฐ์‚ฐ์ด ์ง„ํ–‰๋œ๋‹ค.

์•„๋‹ˆ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋ฉด ๊ตณ์ด asSequence๋ฅผ ์“ฐ๋Š” ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ?

๐Ÿ’ก asSequence()๋ฅผ ์“ฐ๋Š” ์ด์œ 

asSequence() ๋ฌด์กฐ๊ฑด ์จ์•ผํ•˜๋Š” ๊ฑฐ ์•„๋‹ˆ์•ผ? ์— ์žˆ๋Š” ์ผ๋ถ€๋ฅผ ๋ฐœ์ทŒํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

์›์†Œ์˜ ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ๋Š” ๋žŒ๋‹ค ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋” ํฌ๊ณ 
์›์†Œ์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ๋Š” ์ŠคํŠธ๋ฆผ์„ ๋งค๋ฒˆ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋” ํฌ๋‹ค.

์ปฌ๋ ‰์…˜์˜ ํฌ๊ธฐ๊ฐ€ ํด ๋•Œ๋งŒ asSequence() ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋ฐฑ๋ฌธ์ด ๋ถˆ์—ฌ์ผ๊ฒฌ, ์ง์ ‘ ํ•ด๋ณด๋ฉด์„œ ํ™•์ธํ•ด๋ณด์ž.

๐Ÿ‘‰ For example

์˜ˆ์‹œ ์ฝ”๋“œ๋กœ ํ™•์ธํ•ด ๋ณด์ž.

1. stream()๋ฅผ ์ด์šฉํ•ด์„œ ํ•œ ๊ฒฝ์šฐ

val list = listOf("apple","banana","watermelon","cherry")

val list1 = list.stream().filter {
        println("Stream filter: $it")
        it.length > 5
    }.map{
        println("Stream map : $it")
    }.collect(Collectors.toList())

//list1 ๊ฒฐ๊ณผ
Stream filter: apple
Stream filter: apple
Stream map : banana
Stream filter: watermelon
Stream map : watermelon
Stream filter: cherry
Stream map : cherry

2. asSequence()๋ฅผ ์ด์šฉํ•œ ๊ฒฝ์šฐ

val list3 = list.asSequence().filter {
	println("AsSequence filter: $it")
	it.length > 5
    }.map{
        println("AsSequence map: $it")
    }.toList()
    
//list3 ๊ฒฐ๊ณผ
AsSequence filter: apple
AsSequence filter: apple
AsSequence map : banana
AsSequence filter: watermelon
AsSequence map : watermelon
AsSequence filter: cherry
AsSequence map : cherry

stream()๊ณผ asSequence()๋Š” ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
stream()๊ณผ asSequence()๋Š” filter์—์„œ ๊ฑธ๋Ÿฌ์ง„ ์›์†Œ๋ฅผ ๋ฐ”๋กœ map ์—ฐ์‚ฐ์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

3. stream()์„ ์ด์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

val list2 = list.filter {
        println("Not Stream filter : $it")
        it.length > 5
    }.map{
        println("Not Stream map : $it")
    }.toList()

//list2 ๊ฒฐ๊ณผ
Not Stream filter : apple
Not Stream filter : banana
Not Stream filter : watermelon
Not Stream filter : cherry
Not Stream map : banana
Not Stream map : watermelon
Not Stream map : cherry

๋ฐ˜๋ฉด์— kotlin collections๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋งค ์—ฐ์‚ฐ์ž๋งˆ๋‹ค ์ƒˆ๋กœ์šด intermediate collection์ด ์ƒ์„ฑ๋˜์–ด ์—ฐ์‚ฐ์ด ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ‘ ์ฐธ๊ณ 

์ฝ”ํ‹€๋ฆฐ ์ž…๋ฌธ ์Šคํ„ฐํ‹ฐ(15) Sequence
asSequence() ๋ฌด์กฐ๊ฑด ์จ์•ผํ•˜๋Š” ๊ฑฐ ์•„๋‹ˆ์•ผ?

profile
Positive Thinking

0๊ฐœ์˜ ๋Œ“๊ธ€