๋๋ค : ๊ณ ์ฐจํจ์์ ์๊ท๋จผํธ๋ก ์ฌ์ฉ๋๋ ์งง์ ํจ์. ํจ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋์ ๋๋ค๋ฅผ ์ด์ฉํด ์คํ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ํจ์์ ์ ๋ฌํ ์ ์๋ค. ๊ณ ์ฐจํจ์๋ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด์ ๊ฒฐ์ ์ ํ๊ฑฐ๋ ๊ณ์ฐ์ ํ๋ ๋์ ๋๋ค์๊ฒ ๊ฒฐ์ ์ด๋ ๊ณ์ฐ์ ์ํฌ ์ ์๋ค.
๋๋ค ํํ์์ ์ด๋ฆ์ด ์๊ณ ํ์ ์ถ๋ก ์ ์ด์ฉํ ๋ฆฌํด ํ์ ์ ๊ฐ์ง๋ ํจ์์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก ํจ์๋ ์ด๋ฆ, ๋ฆฌํด ํ์ , ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ, ๋ฐ๋์ฒ๋ผ 4๊ฐ์ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์๋ค. ํ์ง๋ง ๋๋ค๋ ํ์์ ์ธ ๋ถ๋ถ๋ง ๊ฐ์ง๊ณ ์๋ค. ๋ฐ๋ก ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ์ ๋ฐ๋ ๋ ๊ฐ๋ค.
{ parameter list -> body }
๋๋ค๋ { }๋ก ๊ฐ์ธ์ ธ ์๋ค. ๋ฐ๋๋ ํ์ดํ(->)๋ฅผ ์ด์ฉํด์ ํ๋ผ๋ฏธํฐ์ ๋ถ๋ฆฌ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋จ์ผ ๋ช ๋ น๋ฌธ ํน์ ๋จ์ผ์์ด๋ค. ํ์ํ๋ค๋ฉด ์ฌ๋ฌ ์ค์ด ๋ ์๋ ์๋ค.
imutable : ์ฝ๊ธฐ ์ ์ฉ ์ธํฐํ์ด์ค
mutable : ์ฝ๊ธฐ-์ฐ๊ธฐ ์ธํฐํ์ด์ค
map( ) ํจ์๋ ์ฃผ์ด์ง ์ฝ๋ ์ ์ ๊ฐ ์์์ ๋๋ค๋ฅผ ์ ์ฉํ ์ ์ฝ๋ ์ ์ ๋ง๋ค์ด์ค๋ค.
์ง์๋ฅผ 2๋ฐฐ๋ก ๋ง๋ค์ด์ ๋ค๋ฅธ ์ฝ๋ ์
์ ์ถ๊ฐํด๋ณด์
์๋๋ ์ธ๋ถ ๋ฐ๋ณต์๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ฝ๋์ด๋ค.
val numbers = listOf(10, 12, 18)
val doubled = mutableListOf<Int>()
for (i in numbers){
if(i % 2 == 0){
doubled.add(i * 2)
}
}
println(doubled) // [20, 24, 36]
์ด์ ๊ฐ์ ๊ธฐ๋ฅ์ ๋ด๋ถ ๋ฐ๋ณต์๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ ๋ฒ์ ์ ์ดํด๋ณด์.
val doubledEven = numbers.filter { e -> e % 2 == 0 }
.map { e -> e * 2 }
println(doubledEven) // [20, 24, 36]
map( ) ํจ์๋ ์ฃผ์ด์ง ์ฝ๋ ์
์ ๊ฐ ์์์ ๋๋ค๋ฅผ ์ ์ฉํ ์ ์ฝ๋ ์
์ ๋ง๋ค์ด์ค๋ค.
์ฝํ๋ฆฐ์ ์ธ๋ถ ๋ฐ๋ณต์๋ ์ข๋ค. ํ์ง๋ง ๋ด๋ถ ๋ฐ๋ณต์๊ฐ ๋ ๋ฐ์ด๋๋ค. ๊ฐ๋ฐ์๋ ๋ณธ์ธ์๊ฒ ๋ ํธํ ๊ฒ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ธ๋ถ ๋ฐ๋ณต์๋ ๋ณดํต for๋ฅผ ์ฌ์ฉํ๋ค. ํ์ง๋ง ๋ด๋ถ ๋ฐ๋ณต์ filter( ), map( ), flatMap( ), reduce( ) ๋ฑ ๋ง์ ํน๋ณํ ๋๊ตฌ๋ฅผ ํฌํจํ๊ณ ์๋ค.
filter( ), map( ), reduce( )๋ ๋ด๋ถ ๋ฐ๋ณต์๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ์ ์ธ ํจ์๋ค์ด๋ค.
filter( ) ํจ์๋ ์ฃผ์ด์ง ์ปฌ๋ ์
์์ ํน์ ๊ฐ์ ๊ณจ๋ผ๋ด๊ณ ๋ค๋ฅธ ๊ฒ๋ค์ ๋ฒ๋ฆฐ๋ค.
map( ) ํจ์๋ ์ปฌ๋ ์
์ ๊ฐ์ ์ฃผ์ด์ง ํจ์๋ ๋๋ค๋ฅผ ์ด์ฉํด์ ๋ณํ์ํจ๋ค.
๋ง์ง๋ง์ผ๋ก reduce( ) ํจ์๋ ์์๋ค์ ๋์ ํด ์ฐ์ฐ์ ์ํํ๋ค. ์ด ์ธ ํจ์๋ ๋ชจ๋ ์ฃผ์ด์ง ์ปฌ๋ ์
์ ๋ณ๊ฒฝํ์ง ์๊ณ ์ฐ์ฐ์ ์ํํ๋ค. ์ธ ํจ์๋ ๋ชจ๋ ๋ณต์ฌ๋ ๊ฐ์ ๋ฆฌํดํ๋ค.
์์ ๋ฅผ ํตํด ์ธ ๊ฐ์ง ํจ์์ ๋์์ ์ดํดํด๋ณด์.
์ผ๋จ Person ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ํ ๊ฐ๋ค๋ก ๋ง๋ ์ปฌ๋ ์
์ ์ฌ์ฉํ๊ธฐ๋ก ํ์.
data class Person(val firstName: String, val age: Int)
val people = listOf
Person ("Sara", 12),
Person("Jill", 51),
Person ("Paula", 23),
Person ("Paul", 25),
Person ("Mani", 12),
Person ("Jack", 70),
Person ("Sue", 10))
๋ด๋ถ ๋ฐ๋ณต์๋ฅผ ์ฌ์ฉํด์ 20์ด ์ด์์ธ ์ฌ๋์ ์ด๋ฆ์ ๋๋ฌธ์๋ก ๋ฐ๊พธ๊ณ , ์ฝค๋ง๋ก ๊ตฌ๋ถํด๋ณด์.
val result = people.filter { person -> person.age > 20 }
.map { person -> person.firstName }
.map { name -> name.toUpperCase() }
.reduce { names, name -> "$names, $name" }
println(result) //JILL, PAULA, PAUL, JACK
filter( ) ํจ์๊ฐ ์ฃผ์ด์ง ์ปฌ๋ ์
์์ ๋์ด๊ฐ 20์ด ์ด์์ธ Person๋ง์ ์ถ์ถํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ถ์ถ๋ ๋ฆฌ์คํธ๋ฅผ map( )์ ์ ๋ฌํ๋ค. map( )์ 20์ด ์ด์์ธ Person์ ๋ฆฌ์คํธ๋ฅผ ์ด๋ฆ๋ฆฌ์คํธ๋ก ๋ณ๊ฒฝํ๋ค. ๋ ๋ฒ์งธ map( )์ ์ ๋ฌ๋ฐ์ ์ด๋ฆ ๋ฆฌ์คํธ๋ฅผ ๋๋ฌธ์๋ก ๋ณ๊ฒฝํ๋ค. 2๊ฐ์ map( ) ํจ์๋ฅผ ํ๋๋ก ํฉ์ณ์ ์ฌ์ฉํ ์ ์์ง๋ง ๋ถ๋ฆฌ์์ผ ๋๋ ๊ฒ์ด ์ฝ๋๋ฅผ ๊ฐ ๋ผ์ธ์ด ํ๋์ ์ฐ์ฐ์ ์ง์คํ ์ ์๋๋ก ํด์ค๋ค. ๋ง์ง๋ง์ผ๋ก reduce( ) ํจ์๋ฅผ ์ด์ฉํด์ ๋๋ฌธ์ ์ด๋ฆ๋ค์ ํ๋์ ๋ฌธ์์ด์ ์ฝค๋ง๋ก ๊ตฌ๋ถํด์ ๋ฃ๋๋ค.
์ฝํ๋ฆฐ์ sum, max, joinToString๊ณผ ๊ฐ์ ์ฌ๋ฌ ์ฐ์ฐ์ ํนํ๋ reduce ์ฐ์ฐ์ ์ ๊ณตํ๋ค. ์์์ ์ฌ์ฉํ reduce( )๋ฅผ ์๋์ฒ๋ผ ๋ณ๊ฒฝํ๋ฉด ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํด์ง๋ค
joinToString(", ")
๋ง์ฝ์ ๋ฆฌ์คํธ์ Person์ ๋์ด๋ฅผ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ํ๋ค๋ฉด map( )๊ณผ reduce( )๋ฅผ ์ฌ์ฉํด์ ์๋์ ๊ฐ์ด ์ฝ๋ฉํ ์ ์๋ค.
val totalAge = people.map { person -> person.age }
.reduce { total, age -> total + age }
println(totalAge)
reduce( ) ๋์ ์ ํนํ๋ reduce ์ฐ์ฐ์ธ sum( )์ ์ฌ์ฉํ ์ ์๋ค.
val totalAge2 = people.map { person -> person.age }
.sum()