fun main() {
// 1. 함수를 대입, 근데 이렇게 쓰면 함수 선언하는 거랑 뭐가 다른 거지? scope 차이는 있을 듯
val lambda = fun(str: String){ println(str) }
lambda("lambda")
// 2. 파라미터 ○, 리턴 값 ○
// (parameter type) -> return type = { parameter 변수 -> return OR 실행할 명령}
// {parameter 변수: parameter type -> return value OR 실행할 명령}
val lambda2: (String, Int) -> String = {name, age -> "My name is $name and $age years old"}
val lambda2_1 = {name: String, age: Int -> "My name is $name and $age years old"}
println(lambda2("lambda2", 26))
println(lambda2_1("lambda2_1", 23))
// 3. 파라미터 ○, 리턴값 X
val lambda3: (String, Int) -> Unit = {name, age -> println("My name is $name and $age years old")}
val lambda3_1 = {name: String, age: Int -> println("My name is $name and $age years old")}
lambda3("lambda3", 26)
lambda3_1("lambda3_1", 26)
// 4. 파라미터 X, 리턴값 ○
val lambda4: () -> String = { "My name is lambda4 and 26 years old" }
val lambda4_1 = { "My name is lambda4 and 26 years old" }
println(lambda4())
println(lambda4_1())
// 5. 람다식을 일반 변수 값으로 전달, 여기서 sum은 람다식이 아니므로 sum이름으로 호출 불가능
// ::sum으로 함수를 람다식처럼 전달
println(funcUsingLambda(100, 200, ::sum))
// 람다식 전달
val lambda5: (Int, Int) -> Int = {para1, para2 -> para1 + para2}
val lambda5_1 = {param1: Int, param2: Int -> param1 + param2}
println(funcUsingLambda(300, 400, lambda5))
println(funcUsingLambda(500, 600, lambda5_1))
//println(funcUsingLambda(700, 900, (Int, Int) -> Int = {param1, param2 -> param1 + param2})) 이건 사용 못하는 듯
println( funcUsingLambda(700, 900, {param1: Int, param2: Int -> param1 + param2}) ) // ①번과
println( funcUsingLambda(700, 900) { param1: Int, param2: Int -> param1 + param2 } ) // ②번 표현을 기억하자
}
//일반 함수를 인자로 전달
fun sum(param1: Int, param2: Int) = param1 + param2
/*
fun sum(param1: Int, param2: Int) {
return param1 + param2
}
*/
fun funcUsingLambda(param1: Int, param2: Int, lambda: (Int, Int) -> Int) = lambda(param1, param2)