์ฝํ๋ฆฐ๋ ๋ง์ฐฌ๊ฐ์ง๋ก Collection ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ค์ํ ํจ์๋ฅผ ์ง์ํ๋ค.
๋ํ์ ์ผ๋ก iterable ์์๋ filter, map ๋ฑ ๋์ผํ ํจ์๋ฅผ ์ง์ํ๋ฉด์, ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
ํ์ง๋ง ์ง์ฐ ์ฐ์ฐ์ ์ํด์๋ ์๋ฐ์ ๊ฐ์ Stream, ์ฝํ๋ฆฐ์์๋ Sequence๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค.
์ ๋ฆฌํด๋ณด์.
Iterable๊ณผ Sequence
public inline fun<T> Iterable<T>.filter(
predicate: (T) -> Boolean
): List<T> {
return filterTo(ArrayList<T>(), predicate)
}
public fun <T> Sequence<T>.filter(
predicate: (T) -> Boolean
): Sequence<T> {
return FilteringSequence(this, true, predicate)
}
iterable์ filter์ sequence์ filter๋ ๋ ๋ค ๋์ผํ ์ค๊ฐ ์ฐ์ฐ์ด์ง๋ง, ๋ฐํํ๋ ๊ฐ์ฒด๊ฐ ๋ค๋ฅด๋ค.
๋, ์ผ๋ฐ์ ์ธ ์ปฌ๋ ์ ์ฒ๋ฆฌ ์ฐ์ฐ์ ํธ์ถํ ๋ ์ฐ์ฐ์ด ์ด๋ฃจ์ด์ง๋ค.
๋ฐ๋ฉด, ์ํ์ค๋ ์ต์ข ์ฐ์ฐ(toList ๋ฑ๋ฑ)์ด ์ผ์ด๋ ๋๊น์ง ์ด๋ ํ ์ฐ์ฐ๋ ์ผ์ด๋์ง ์๋๋ค.
์ํ์ค ์ง์ฐ ์ฒ๋ฆฌ์ ์ฅ์
- ์์ฐ์ค๋ฌ์ด ์ฒ๋ฆฌ ์์๋ฅผ ์ ์ง
- ์ต์ํ๋ง ์ฐ์ฐ
- ๋ฌดํ ์ํ์ค ํํ ์ฌ์ฉ ๊ฐ๋ฅ
- ๊ฐ๊ฐ์ ๋จ๊ณ์์ ์ปฌ๋ ์ ์ ๋ง๋ค์ง ์์
sequenceOf(1, 2, 3)
.filter { print("F$it, "); it % 2 == 1 }
.map { print("M$it, "); it * 2 }
.forEach { print("E$it, ") }
// F1, M1, E2, F2, F3, M3, E6,
listOf(1, 2, 3)
.filter { print("F$it, "); it % 2 == 1 }
.map { print("M$it, "); it * 2 }
.forEach { print("E$it, ") }
// F1, F2, F3, M1, M3, E2, E6,
์ํ์ค์ ์ฒ๋ฆฌ๋ ์์ ํ๋ํ๋๋น ์ง์ ํ ์ฐ์ฐ์ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ๋ค. => element-by-element order
์ดํฐ๋ฌ๋ธ์ ์์ ์ ์ฒด๋ฅผ ๋์์ ๋์์ผ๋ก ์ฐ์ฐ์ ์ฐจ๊ทผ์ฐจ๊ทผ ์ ์ฉํ๋ค. => step-by-step order
์์ปจ์ค์ ์ฒ๋ฆฌ๋ ๋ด๋ถ์ ์ผ๋ก ๊ณ ์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ฏ๋ก, ํจ์ฌ ๋น ๋ฅด๊ณ ์์ฐ์ค๋ฌ์ด ์ฒ๋ฆฌ์ด๋ค.
๋ก์ฐ ๋ ๋ฒจ ์ปดํ์ผ๋ฌ์ ์ต์ ํ๊ฐ ์งํ๋๋ฉด, ์ฒ๋ฆฌ๊ฐ ํจ์ฌ ๋นจ๋ผ์ง ๊ฒ์ ๊ธฐ๋ํ ์ ์๋ค.
์ต์ ์ฐ์ฐ
๋ชจ๋ ๊ฒ์ ์์ ์ ์ฒด์ ์ ์ฉํ๋ ์ดํฐ๋ฌ๋ธ๊ณผ ๋ฌ๋ฆฌ, ์ค๊ฐ ์ฐ์ฐ์ด ์๋ ์ํ์ค๋ ์ํ๋ ์์์๋ง ์ฐ์ฐ์ ์ ์ฉํ ์ ์๋ค.
(1..10).asSequence()
.filter { print("F$it, "); it % 2 == 1 }
.map { print("M$it, "); it * 2 }
.find { it > 5 }
// F1, M1, F2, F3, M3,
(1..10)
.filter { print("F$it, "); it % 2 == 1 }
.map { print("M$it, "); it * 2 }
.find { it > 5 }
// F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, M1, M3, M5, M7, M9
์ค๊ฐ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ๋ชจ๋ ์์์ ์ ์ฉํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ํ์ค๊ฐ ์ด๋์ด๋ค.
์์๋ฅผ ์ ํํ ์ฐ์ฐ์ first์ take๋ฅผ ์์ฃผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค.
๊ฐ ๋จ๊ณ์์ ์ปฌ๋ ์ ์ ๋ง๋ค์ง ์๋๋ค.
ํ์ค ์ปฌ๋ ์ ์ฒ๋ฆฌ ํจ์๋ ๊ฐ ๋จ๊ณ ๋ณ๋ก ์๋ก์ด ์ปฌ๋ ์ ์ ๋ง๋ ๋ค.
์ผ๋ฐ์ ์ผ๋ก List๋ฅผ ์๋ก ๋ง๋ค์ด ๋ฐํํ๋ค.
์ด๋ ์ปฌ๋ ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฏ๋ก, ๋น์ฉ์ด ๋ฐ์ํ๊ณ ๊ทธ๋งํผ ๋ฌด๊ฒ๊ณ ๋๋ฆฌ๋ค๋ ์๋ฏธ์ด๋ค.
๋ฌด๊ฑฐ์ด ์ปฌ๋ ์ ์ ์ฒ๋ฆฌํ ๋ ํนํ ์ํํ๋ค.
์๋ชปํ๋ฉด OOM์ด ํฐ์ง ์๋ ์๋ค.
๋ฐ๋ฉด, ์ํ์ค๋ ์ํ์ค๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์,
์ด๋ฌํ ๊ฑฑ์ ์ ํ์ง ์์๋ ๋๋ค.
์ ๋ฆฌ
์ปฌ๋ ์ ๊ณผ ์ํ์ค๋ ๊ฐ์ ์ฒ๋ฆฌ ํจ์๋ฅผ ์ง์ํ๊ณ , ์ฌ์ฉ ํํ๊ฐ ๋น์ทํ์ง๋ง, Lazy ํ๊ฒ ์ฒ๋ฆฌ๋๋ค๋ ์ํ์ค์ ์ฅ์ ์ ๋์ฌ๋ฒฝ์ด๋ค.
์์ผ๋ก ์๋ฐ์ Stream ์ฒ๋ผ ์ฝํ๋ฆฐ์์๋ Sequence๋ฅผ ์์ฃผ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ๋ค.