文章目录
- 一、函数引用作为函数参数
- 二、函数类型作为函数返回值
一、函数引用作为函数参数
函数 作为参数 , 有两种方式 :
- 传递 Lambda 表达式 , 也就是 匿名函数 作为参数值 ;
- 传递 函数引用 作为参数值 ;
函数引用 可以将 具名函数 转为 函数的参数值 , 只要可以使用 Lambda 表达式 参数的地方 , 就可以使用 函数引用 进行替代 ;
函数引用格式 : 两个冒号 加上 函数名 , 就是函数引用 ;
代码语言:javascript复制::函数名
如下 doSomething
函数的 函数引用 是 ::doSomething
;
fun doSomething(name: String, age: Int): String {
return "student $name $age years old, say hello"
}
具名函数 与 匿名函数 相对 , 具名函数 是有 函数名的函数 , 匿名函数 没有函数名 ;
代码示例 : 在下面的代码中 ,
首先使用 actionFun
函数类型变量 作为 studentDoSomething
函数的参数 , 该变量的值是一个 匿名函数 Lambda 表达式 ,
然后使用 doSomething
函数的 函数引用 ::doSomething
作为 studentDoSomething
函数的参数 ,
使用 匿名函数 Lambda 表达式 作为参数 与 使用 函数引用 作为参数 , 其效果是相同的 ;
代码语言:javascript复制fun main() {
// 定义函数类型变量, 之后作为函数参数传递给函数
// 该匿名函数变量, 可以作为参数
val actionFun = { name: String, age: Int ->
"student $name $age years old, say hello"
}
// 调用 studentDoSomething 函数, 输入姓名, 年龄, 执行的操作
// 使用匿名函数 Lambda 表达式作为参数
studentDoSomething("Tom", 18, actionFun);
// 使用函数引用作为参数
studentDoSomething("Jerry", 17, ::doSomething);
}
fun studentDoSomething(name: String, age: Int,
action: (String, Int) -> String) {
val act = action(name, age);
println(act)
}
fun doSomething(name: String, age: Int): String {
return "student $name $age years old, say hello"
}
执行结果 :
代码语言:javascript复制student Tom 18 years old, say hello
student Jerry 17 years old, say hello
二、函数类型作为函数返回值
函数 的 返回值类型 , 也可以是 函数类型 ;
也就是说 匿名函数 , Lambda 表达式 可以作为 函数的返回值 ;
代码示例 : 下面的代码中 ,
returnFun
函数的返回值 是一个函数类型 (String)->String
, 返回的是一个 匿名函数 Lambda 表达式 ;
使用 var fun0
变量 接收 上述函数 返回的 Lambda 表达式 , 并执行该 匿名函数 ;
fun main() {
// 接收函数类型的返回值
var fun0 = returnFun();
// 执行 返回的 函数
var str = fun0("Tom")
println(str)
}
// 函数的返回值 是函数类型
fun returnFun(): (String)->String {
return { name: String ->
"Hello $name"
}
}
执行结果 :
代码语言:javascript复制Hello Tom