람다식은 우리가 마치 value처럼 다룰 수 있는 익명 함수
1) 메소드의 파라미터로 넘겨줄 수 있다
2) return 값으로 사용할 수 있다
//람다의 기본 정의
val lamdaName : Type = { argumentList -> codeBody }
//첫 번째
val square : (Int) -> (Int) = { number -> number*number }
//두 번째
val square = { number : Int -> number*number }
fun main(){
println(square(12))
}
val square = { number : Int -> number*number }
val nameAge = { name : String, age : Int -> "My name is ${name} I'm ${age}"
}
fun main(){
println(square(12))
println(nameAge("example", 50))
}
타입 추론 가능 하려면 어떻게 써야 하는 지
중괄호 사용 시 함수도 똑같이 변수 안에 넣을 수 있다
fun main(){
val a = "A said"
val b = "B said"
//String class 사용
println(a.pizzaIsGreat())
println(b.pizzaIsGreat())
}
//this는 String 오브젝트 그 자체를 가르킴
val pizzaIsGreat : String.() -> String = {
this + "Pizza is the best!"
}
확장 함수 예시
fun main(){
println(extendString("C", 66))
}
//this가 가르키는 것은 확장 함수가 불러줄 오브젝트
fun extendString(name : String, age : Int ) : String {
val introduceMyself : String.(Int) -> String = {"I'm ${this} and ${it}years old"}
return name.introduceMyself(age)
}
파라미터가 하나 일 때 it을 사용 가능
fun main(){
println(calculateGrade(66))
}
// 파라미터가 여러 개일 경우를 대비해서 소괄호 써줌
val calculateGrade : (Int) -> String = {
when(it){
in 0..40 -> "fail"
in 41.70 -> "pass"
in 71..100 -> "perfect"
else -> "Error" //else를 써주지 않으면 에러 발생
}
}
fun main(){
val lamda = { number : Double -> number == 4.3213 }
println(invokeLamda(lamda))
println(invokeLamda({true}))
println(invokeLamda({ it > 3.22 }))
// 마지막 파라미터
println(invokeLamda{ it > 3.22 })
}
//파라미터를 넣는 람다식
fun invokeLamda( lamda : (Double) -> Boolean ) : Boolean {
return lamda(5.2343)
}
function의 마지막 파라미터가 람다식일 때 생략이 가능
button.setOnClickListener{
//to do
}
코틀린 인터페이스가 아닌, 자바 인터페이스여야 함
인터페이스는 딱 하나의 메소드를 가져야 함
익명 내부 함수는 람다식으로 표현을 위의 조건 두 개 충족
참조 : Code with Joyce