- 描述
最近公司强制要求开发使用kotlin和java混合开发,又看了看kotlin的函数的用法。因为kotlin函数和JS的函数编程相似,支持函数闭包,所以kotlin的函数比起java的方法灵活多了,如:函数嵌套,函数变量,高阶函数。
1.函数嵌套
fun nestedFun() {
var a = 1
//内部函数
fun innerFun(a: Int): Int = a + 1
println("${innerFun(a)}")
}
2.函数变量
//函数变量
var method = fun(){ println("匿名函数")}
//如果函数只有一个表达式大括号可以去掉
var method1 = fun() = println("匿名函数")
//fun关键字去掉
var method2 = println("匿名函数")
//调用
method()
method1()
method2()
- 高阶函数的定义
以另一个函数作为参数,或者返回值是函数 称为 高阶函数
涉及知识点:需要补充一些lambda的语法糖
- 示例
a.接口回调
public interface RequestCallback<R> {
/**
* 结果回调
*/
void onResponse(R res);
/**
* 错误回调
*/
void onError(int code, String desc);
}
fun requestCallBack(res: String?, callback: RequestCallback<String>) {
if (null == res) {
callback.onError(-1, "无响应结果")
} else {
callback.onResponse(res)
}
}
requestCallBack("success", object : RequestCallback<String> {
override fun onError(code: Int, desc: String?) = println("ErrorCode:$code, Desc:$desc")
override fun onResponse(res: String?) = println("Response:$res")
})
每次kotlin在使用java的回调时都需要创建一个object对应的回调对象,来看看kotlin高阶函数回调方式,是不是简便多了。
b.数回调
fun requestFunCallback(res: String?,onResponse: (res: String) -> Unit,onError: (code: Int, desc: String) -> Unit) {
if (null == res) {
onError(-1, "无响应结果")
} else {
onResponse(res)
}
}
//kotlin中调用方法的最后一个参数为函数时,可以把匿名函数写在括号外面
requestFunCallback("success",{ res -> println("Response:$res") }) { code, desc -> println("ErrorCode:$code, Desc:$desc") }
函数作为返回值的情况,目前我能想到的就是对函数结果的转换,还没找到其他更好的可以使用的地方,如:数据包装,状态改变
a. 数据包装
//这里使用的闭包函数
fun request(data: Double): (country: Int) -> String = {
when (it) {
0 -> "${data}人民币"
1 -> "${data}欧元"
else -> "${data}美元"
}
}
request(88)()
b. 状态改变
fun parseData(data:String): (state: String) -> Unit {
//data转换
return fun(state: String) {
when(state){
"onDestroy"-> println("页面$state, 缓存$data")
"onResume"->println("页面$state, 缓存${data},且在界面上显示")
}
}
}
var data = parseData("data")
fun onResume(){
data("onResume")
}
fun onDestroy(){
data("onDestroy")
}
- 总结
目前Google已经主推用kotlin来开发Android,或多或少还是得跟上kotlin转型,关于kotlin的函数还有很多其他特殊用法,如:infix,inline,noinline,crossinline, 扩展函数等等,技术更新太快,要学的太多,苦逼的程序员加油学习。