fun main() {
val lam1 = {a:Int,b:Int->a*b}
val lam2 : (a:Int, b:Int)->Int = {a,b->a*b}
}
람다식은 기본적으로 {사용할 매개변수 -> 반환식}의 형태로 정의한다.
앞에서 함수의 인자로 람다식을 전달할 때는 {a,b->a+b}와 같은 형태로 전달했다.
이것은 함수의 선언에서 이미 sum : (a:Int, b:Int)->Int와 같이 자료형읠 정의했기 때문이다.
람다식을 이렇게 바로 사용하는 경우에는 람다식 1처럼 {}내에 자료형을 명시해줘야 한다.
{}에서 자료형을 생략하고 싶다면 람다식 2처럼 먼저 람다식 선언을 하고 정의해줘야 한다.
(매개변수:자료형, 매개변수:자료형 .. ) -> 반환형 = {람다식} 과 같이 사용한다.
또한 표현식의 형태를 통해 자료형을 추론할 수 있다면 명시하지 않아도 된다.
fun main() {
val greet = {println("greetings")}
}
greet는 표현식에 출력문만 존재하므로 매개변수가 없고 반환형도 없다는 것을 추론할 수 있다. 따라서 선언부나 표현식에 자료형을 생략했다.
또한 Kotlin에서 함수는 일급객체이므로 변수에 함수를 넣을 수 있다.
lam1과 lam2는 람다식을 값으로 넣은 변수이다. 따라서 변수를 함수처럼 사용할 수 있다.
fun main() {
val lam1 = { a: Int, b: Int -> a * b }
val lam2: (a: Int, b: Int) -> Int = { a, b -> a * b }
println(lam1(5,2))
println(lam2(3,6))
}
10
18
선언부나 매개변수 부분에 적어도 한 부분은 자료형을 명시해 줘야 한다.
두 부분에서 모두 생략하면 자료형을 추론할 수 없다.
fun main() {
val lam2: (a: Int, b: Int) -> Int = { a, b ->
println("${a} * ${b} = ${a*b}")
a * b //반환식
}
println(lam2(10,20))
}
10 * 20 = 200
200
표현식이 2줄 이상인 경우 -> 이후 부분을 다음 줄로 개행해서 작성할 수 있다. 이 경우 마지막 문장이 반환식이 된다.
fun main() {
val greet : ()->(Unit) = {println("nice to meet you")}
val square : (Int)->(Int) = {x->x*x}
}
greet은 매개변수가 0개이고 반환값이 없다.
따라서 반환값을 매개변수는 빈 괄호 (), 매개변수는 (Unit)으로 명시해준다.
표현식에서도 매개변수가 없기 때문에 -> 포함 앞부분을 생략하고 출력문만 작성한다.
square은 매개변수가 1개이므로 매개변수를 1개만 작성하면 된다.
fun main() {
val nested : ()->()->(Unit) = {{println("nested lambda")}}
nested()
}
->를 2회 사용해서 선언부를 나타내고 표현식도 {{}}로 괄호를 중첩해서 나타낸다.