1) 일반 변수에 람다식 할당
val lamTest: (Int,Int) -> Int = {x: Int, y: Int ->
var a: Int = x * y
a + y
} // 마지막 표현식 a + y가 반환됨
println(lamTest(2, 3)) //9
//매개변수 x & 반환자료형 x
var a1:() -> Unit = {println("test")}
a1() //test
2) 함수의 인자로 람다식 전달
fun printTest1(a: Int) {
println(a)
}
fun printTest2(a: (Int, Int) -> Int) {
var ret = a(2, 3)
println(ret)
}
fun lam2(a: Int, b: Int) = a + b + 4
fun main() {
val lam1: (Int, Int) -> Int = {a, b -> a + b + 4}
//값에 의한 호출
printTest1(lam1(2, 3)) //9
//이름에 의한 호출
printTest2(lam1) //9
//printTest2(lam2) //컴파일 에러 : Type mismatch: inferred type is Int but (Int, Int) -> Int was expected
//다른 함수 참조에 의한 호출
printTest2(::lam2) //9
}
fun lamt(a:Int, b: () -> String) {
println(b())
}
fun lamt2(b: () -> String) {
println(b())
}
fun main() {
lamt(1, {"hi"})
lamt(1){"hi"} //람다식이 함수의 마지막 매개변수인 경우
lamt2({"hi2"})
lamt2{"hi2"} //람다식이 유일한 매개변수인 경우
}
3) 람다식 표현의 간략화
var aa1: (String) -> String = {a -> "Hello$a"}
// a -> 부분 생략 & it 지칭
var aa2: (String) -> String = {"Hello$it"}
println(aa1("!")) //Hello!
println(aa2("!")) //Hello!
var test: (Int, Int) -> Int = { a, _ -> 3 + a}
println(test(1, 2)) //4