람다식은 마치 value처럼 다룰수 있는 익명함수이다.
1) 메소드에 파라미터로 함수를 넘겨줄 수 있다.
2) return 값으로 사용할 수 있다.
3) argument타입을 선언해야 하며, 추론할 수 있을때는 생략할 수 있다.
4) 함수의 반환값은 함수내용의 마지막 표현식이다.
val LamdaName: Type = {argumentList -> codeBody}
ex)
val square: (Int)->(Int) = {number : Int -> number*number}
val nameAge= {name:String, age:Int ->
"my name is ${name} and i'm ${age}"
}
fun main(){
println(square(12))
println(nameAge("lee", 33))
}
컴파일러가 추론할수 있다는 말의 의미
val upperCase1:(String)->String = {str:String -> str.uppercase()}
val upperCase2 = {str:String -> str.uppercase()}
val upperCase3 :(String)->String = { str ->str.uppercase() }
val upperCase4 :(String)->String ={it.uppercase()}
it은 input파라미터가 하나일경우 명시적인 파라미터를 쓰지않고 암시적인 파라미터it을 사용하여 body부분만 작성.
kotlin에서 확장함수 개념을 사용하면, 외부라이브러리의 자체클래스는 변경할수 없지만, 이를 활용하여 개발자가 원하는 새로운 함수들을 만들수 있다.
receiver type : 확장함수를 추가할 클래스, 확장대상이 될 클래스
receiver object : 확장함수 내부에서 this키워드로 receiver type이 가지고 있는 인스턴스에 접근가능 -> 이런 객체를 receiver object라 한다.
fun extendString(name:String, age:Int):String {
val intro:String.(Int)->String={
"i'm ${this} and i'm ${it} years old"
}
return name.intro(age)
}
fun main(){
println(extendString(name:"lia", age:25)
반드시 return값이 있어야하기 때문에 반드시 else를 써줘야 한다.
val calculater: (Int)-> String ={
when(it){
in 0..40 ->"fail"
in 40..70 -> "pass"
else -> "okay"
}
}
아래의 함수 invokeLambda는 double을 받아서 boolean으로 리턴하는 람다식 자체를 파라미터로 받아서, boolean타입으로 리턴하는 함수이다.
fun invokeLambda(lambda:(Double)->Boolean):Boolean{
return lambda(5.32)
}
그리고 main함수내에 lambda를 선언해준다.
lambda는 주어진수가 3.14면 true,아니면 false를 반환한다.
fun main(){
val lambda:(Double)->Boolean = {num-> num==3.14}
}
그리고 main함수내에서 invokeLambda를 호출하여 결과값을 프린트하는 방법에는 두가지가 있다.
//1
println( invokeLambda(lambda) )
//2 곧장 람다식을 파라미터로 넘겨준다.
println( invokeLambda({it>3.23})
두번째 방식에서 람다식이 함수의 첫번째이자 마지막 파라미터이므로
invokeLambda({it>3.22})
=> invokeLambda(){it>3.22}
=> invokeLambda{it>3.22}
로 쓸수도 있다.