fun funcFunc(a:Int, b:Int)=sum(a,b)
//sum은 두 수를 합하는 함수이다.
val result3=funFunc(2,3)
fun main(){
val result=callByValue(lambda())
//람다식 함수를 호출
println(result)
}
fun callByValue(b: Boolean):Boolean{
//일반 변수의 자료형으로 선언된 매개변수
println("callByValue function")
return 0
}
//람다 표현식이 아래처럼 두 줄
val lambda: () -> Boolean = {
println("lambda function")
true //마지막 표현식의 문장 결과가 반환
}
fun main(){
val result=callByName(otherLambda)
//람다식 함수를 이름으로 호출
println(result)
}
fun callByName (b:( ) -> Boolean) : Boolean{
//람다식 함수 자료형으로 선언된 매개변수
println("callByName function")
return b()
}
//람다 표현식이 아래처럼 두 줄,
//결과가 반환되는 것이 아니라 함수 자체가 매개변수 내부로 들어감
val lambda: () -> Boolean = {
println("otherlambda function")
true
}
실행순서
람다식 자체가 매개변수에 복사되고, 람다식 함수가 호출되어 실행된다. 그 후 true를 반환하고, b() 결과인 true를 main()으로 반환하며 종료한다.
값에 의한 호출과 이름에 의한 호출은 수행 순서가 다르니 주의해야 한다.
fun sum(x: Int, y: Int) = x+y
funcParam(3,2,sum) //에러 발생
fun funcParam(a:Int, b:Int, c:(Int, Int) -> Int): Int {
return c(a,b)
}
funcParam(3,2,::sum)
fun main() {
// 매개변수 없는 람다식 함수
noParam({ "Hello World!" })
noParam { "Hello World!" } // 위와 동일 결과, 마지막 매개변수가 람다식으로 구성된 경우 소괄호 생략 가능
noParam(){"Hello World!"} // 위 식과 동일
}
// 매개변수가 없는 람다식 함수가 noParam 함수의 매개변수 out으로 지정됨
fun noParam(out: () -> String) = println(out())
fun main() {
// 매개변수 없는 람다식 함수
...
// 매개변수가 하나 있는 람다식 함수
// a는 람다식의 인자로 사용될 변수
oneParam({ a -> "Hello World! $a" })
oneParam { a -> "Hello World! $a" } // 위와 동일 결과, 소괄호 생략 가능
oneParam { "Hello World! $it" } // 위와 동일 결과, it으로 대체 가능
}
...
// 매개변수가 하나 있는 람다식 함수가 oneParam함수의 매개변수 out으로 지정됨
fun oneParam(out: (String) -> String) {
println(out("OneParam"))
}
it은 하나의 키워드로, 앞쪽에서 가져온 변수 하나를 지칭하는 데 사용. 변수가 2개인 경우 it 사용 불가.
매개변수가 두 개인 경우
fun main() {
...
// 매개변수가 두 개 있는 람다식 함수
moreParam { a, b -> "Hello World! $a $b"} // it으로 매개변수명 생략 불가
...
}
// 매개변수가 두 개 있는 람다식 함수가 moreParam 함수의 매개변수로 지정됨.
fun moreParam(out: (String, String) -> String) {
println(out("OneParam", "TwoParam"))
}
moreParam(_,b->"Hello World! $b")
fun main(){
//인자와 함께 사용하는 경우
withArgs("Arg1","Arg2",{a,b -> "Hello World! $a $b"})
//withArgs()의 마지막 인자가 람다식인 경우 소괄호 바깥으로 분리 가능, 일반 매개변수는 생략 불가능
withArgs("Arg1","Arg2"){a,b->"Hello World! $a $b"}
}
//withArgs함수는 일반 매개변수 2개를 포함, 람다식 함수를 마지막 매개변수로 가짐
fun withArgs(a:String, b:String, out: (Stirng, String) -> String)
//a와 b는 기본 타입으로 만들어진 변수, 맨 마지막에 들어간 변수는 람다식 형태를 취하고 있음.
fun main(){
twoLambda({a,b -> "First $a $b"},("Second $it"))
twoLambda({a,b -> "First $a $b"}) {"Second $it"} //위와 동일
}
fun twoLambda (first: (String, String) -> String, second : (String) -> String ) {
println(first("OneParam","TwoParam"))
println(second("OneParam"))
}
: 마지막 람다식만 뒤로 빼낼 수 있음.
- ({첫 번째), {두 번째}) = ({첫 번째}) 두 번째
- ({첫 번째},{두 번째}) {세 번째}