kotlin高阶函数用法

- 描述
最近公司强制要求开发使用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的语法糖

- 示例

  1. 函数当作形

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") }
  1. 函数当作返回值

函数作为返回值的情况,目前我能想到的就是对函数结果的转换,还没找到其他更好的可以使用的地方,如:数据包装,状态改变

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, 扩展函数等等,技术更新太快,要学的太多,苦逼的程序员加油学习。

你可能感兴趣的:(android)