11Kotlin项目实操之高阶函数二

Posted 清风百草

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11Kotlin项目实操之高阶函数二相关的知识,希望对你有一定的参考价值。

(1)一个人只要自己不放弃自己,整个世界也不会放弃你.
(2)天生我才必有大用
(3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟.
(4)做难事必有所得
(5)精神乃真正的刀锋
(6)战胜对手有两次,第一次在内心中.
(7)好好活就是做有意义的事情.
(8)亡羊补牢,为时未晚
(9)科技领域,没有捷径与投机取巧。
(10)有实力,一年365天都是应聘的旺季,没实力,天天都是应聘的淡季。
(11)基础不牢,地动天摇
(12)写博客初心:成长自己,辅助他人。当某一天离开人世,希望博客中的思想还能帮人指引方向.
(13)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~

【11】Kotlin项目实操之高阶函数二

1.使用高阶函数

(1)高阶函数可以理解为定义在函数中的函数
(2)一般在函数的形参中定义
(3)高阶函数在函数形参中定义,还可以在函数体中获得调用。
(4)本节重点就是用高阶函数给成员属性、函数、以及类(Context)作扩展

1.1完成高阶登录

/**
 * @author XiongJie
 * @version appVer
 * @Package com.gdc.kotlin.core.higherfun
 * @file
 * @Description:高阶函数实现登录
 * @date 2021-6-6 09:02
 * @since appVer
 */
fun main() {
    //1.登录
    loginEngine("Derry","123456")

    //2.高阶函数run
    /*run {

    }*/
}

/**
 * 1.对外暴露
 */
fun loginEngine(userName:String,userPwd:String):Unit{
    /*
        1.1使用高阶函数,调用高阶函数
        (1){}中的内容等同于loginService参数中的高阶函数的实现体
        (2)name,pwd为两个形参
     */
    loginService2(userName,userPwd){
        name,pwd ->
        if(name == "Derry" && pwd=="123456"){
            println("恭喜:${name}登录成功")
        }else{
            println("登录失败,请检查用户名或密码")
        }
    }
}

/**
 * 1.登录服务
 * 1.1高阶函数的使用
 * (1)形参中使用无返回值的高阶函数
 * requestLogin:(String,String) -> Unit
 * (2)不对外暴露使用private关键字
 */
private fun loginService1(userName:String,userPwd:String,requestLogin:(String,String)
-> Unit){
    //高阶函数的实现
    requestLogin(userName,userPwd)
}

/**
 * 1.使用别名将高阶函数定义在外面
 */
private fun loginService2(userName:String,userPwd:String,requestLogin:RequestLogin)
        :Unit{
    //高阶函数的实现
    requestLogin(userName,userPwd)
}

/**
 * 1.对高阶函数再次封装
 * (1)使用别名
 * (2)类似于定义标准
 */
typealias RequestLogin = (String,String) -> Unit

1.1.1在函数形参中定义高阶函数

/**
 * 1.登录服务
 * 1.1高阶函数的使用
 * (1)形参中使用无返回值的高阶函数
 * requestLogin:(String,String) -> Unit
 * (2)不对外暴露使用private关键字
 */
private fun loginService1(userName:String,userPwd:String,requestLogin:(String,String)
-> Unit){
    //高阶函数的实现
    requestLogin(userName,userPwd)
}

1.1.2在函数形参中使用别名定义高阶函数

/**
 * 1.使用别名将高阶函数定义在外面
 */
private fun loginService2(userName:String,userPwd:String,requestLogin:RequestLogin)
        :Unit{
    //高阶函数的实现
    requestLogin(userName,userPwd)
}

/**
 * 1.对高阶函数再次封装
 * (1)使用别名
 * (2)类似于定义标准
 */
typealias RequestLogin = (String,String) -> Unit

1.1.3高阶函数的调用

/**
 * 1.对外暴露
 */
fun loginEngine(userName:String,userPwd:String):Unit{
    /*
        1.1使用高阶函数,调用高阶函数
        (1){}中的内容等同于loginService2参数中的高阶函数的实现体
        (2)name,pwd为两个形参
     */
    loginService2(userName,userPwd){
        name,pwd ->
        if(name == "Derry" && pwd=="123456"){
            println("恭喜:${name}登录成功")
        }else{
            println("登录失败,请检查用户名或密码")
        }
    }
}

1.2有返回值但无具体实现的高阶函数

1.2.1在函数参数中定义有返回值无实现的高阶函数

/**
 * 1.高阶函数
 * (1)参数中声明高阶函数
 * responseResult:(Boolean)-> Unit表明高阶函数有返回值,但没有具体的实现
 *
 * (2)在函数内部传递高阶函数
 */
fun login(userName:String,userPwd:String,responseResult:(Boolean) -> Unit){
    //传递高阶函数
    loginEngine(userName,userPwd,responseResult)
}

1.2.2调用

    /**
     * 1.登录最终的需求,倒着写实现
     * (1){}的实现中的it值来自于调用高阶函数的返回值
     */
    login("张三","123456"){
        if(it){
            println("最终得到的结果是登录成功")
        }else{
            println("最终得到的结果是登录失败")
        }
    }

1.2.3高阶函数作为形参传递

/**
 * 1.在函数内部完成登录功能
 * responseResult:(Boolean)表明高阶函数有返回值
 */
private fun loginEngine(userName:String,userPwd:String,responseResult:(Boolean) -> Unit){
    val DB_USER_NAME="张三"
    val DB_USER_PWD = "123456"
    if(userName == DB_USER_NAME && userPwd == DB_USER_PWD){
        //TODO 模拟做了很多业务逻辑
        // .......
        //调用高阶函数
        responseResult(true)
    }else{
        //TODO 模拟做了很多业务逻辑
        // .......
        responseResult(false)
    }
}

1.2.4高阶函数无参但有返回值

/**
 * 1.高阶函数
 * (1)高阶函数无参但有返回值
 *   mm:() -> Boolean
 * (2)高阶函数的返回值与函数的返回值没有任何关系
 * (3)return 9999表示的是loginTest函数的返回值
 * (4)mm:() -> Boolean,是高阶函数调用的返回值,其实现体在main中,{true},值为true
 */
fun loginTest(mm:() -> Boolean):Int{
    val result = mm()
    println("result:$result")
    return 9999
}

1.2.5高阶函数调用(无参但有返回值)

	/**
     * 1.有返回值的高阶函数调用
     * 1.1{}是高阶函数的实现区域,{}表示无参
     * 1.2{true}表示高阶函数的返回值
     */
    loginTest(){
        true
    }

1.3给泛型增加扩展函数

1.3.1扩展函数定义

/**
 * 1.给泛型增加扩展函数
 * (1)定义泛型T,定义泛型R
 * (2)T.myRun()表示给泛型增加扩展函数
 * (3)m:T.() -> R:
 * - 表示给扩展函数增加一个匿名函数
 * - 其中的m可以理解为高阶函数的方法名
 * - T.()表示给T增加一个匿名函数,这个匿名函数是给高阶函数用的
 * - 扩展函数的返回值为R
 */
fun<T,R>T.myRun(m:T.() -> R) : R{
    //调用匿名函数包含的高阶函数
    return m()
}

1.3.2定义普通函数

fun commont(){
    println("我就是方法")
}

1.3.3给普通函数添加扩展函数并调用扩展函数

    commont().myRun {
        println("扩展函数中的高阶函数执行返回后执行")
    }

1.3.4扩展函数中使用高阶函数

/**
 * 1.扩展函数中使用高阶函数
 * (1)将泛型T指定为高阶函数
 */
fun<T,R>T.myRun1(m:() -> R) : R{
    //调用高阶函数
    return m()
}

1.3.5简写为一行

fun<T,R>T.myRun2(m:() -> R) : R = m()

1.3.6将泛型T指定为高阶函数

 /**
     * 1.将泛型T指定为高阶函数,高阶函数的返回值为泛型
     * (1)高阶函数体返回值为boolean
     */
    commont().myRun2 { 
        true
    }

    /**
     * 1.将泛型T指定为高阶函数,高阶函数的返回值为泛型
     * (1)高阶函数体返回值为Int
     */
    commont().myRun2 {
        9999
    }

1.4 给泛型添加扩展函数

(1)可以将基本类型理解为泛型,普通函数也可以理解为泛型,它们都可以被泛型接纳
(2)可以为它们添加扩展函数,在扩展函数中又可以使用高阶函数
(3)而匿名函数又可以被高阶函数使用。

val nameS : String = "张三"
val ageS : Int = 0

fun main() {
    //1.扩展函数的使用
    common1().myRunOk {
        //1.高阶函数体实现
        "高阶函数返回值"
    }

    common1().myRunOk1 {
        //1.高阶函数体实现
        println("高阶函数体实现返回Boolen型")
        true
    }

    common1().myRunOk2 {
        //1.高阶函数体实现
        println("高阶函数体实现返回Double型")
        1.1
    }

    nameS.myRunOk1 { true }
    ageS.myRunOk2 { 22.0 }
}

fun common1() {
    println("普通函数执行")
}

/**
 * 1.给普通函数添加扩展函数
 *
 * 1.1给万能类型添加扩展函数
 *
 * (1)fun<万能类型> 万能类型.myRunOk()
 *
 * (2)给扩展函数的参数中定义高阶函数
 *  mm:() -> String:高阶函数返回值为String
 *
 *  (3)执行高阶函数
 */
fun<万能类型> 万能类型.myRunOk(mm:() -> String){
    //执行高阶函数
    mm()
}

fun<万能类型> 万能类型.myRunOk1(mm:() -> Boolean){
    //执行高阶函数
    mm()
}

fun<万能类型> 万能类型.myRunOk2(mm:() -> Double){
    //执行高阶函数
    mm()
}

1.5给Context添加一个toast

1.5.1定义

/**
 * 1.给Context添加扩展函数toast
 * (1)在可见范围内扩展,即在Context范围内扩展
 */
fun Context.toast(info:String){
    //this指的是扩展函数
    Toast.makeText(this,info,Toast.LENGTH_SHORT).show()
}

1.5.2使用

class ToastActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_toast)
        toast("张荣你好")
    }
}

1.6泛型T作为高阶函数参数

1.6.1定义

/**
 * 泛型T作为高阶函数参数
 * (1)myMethod是一个高阶函数
 */
fun<T,R> T.myLet(myMethod:(T)->R):R{
    //T 就是 this
    return myMethod(this)
}

1.6.2使用

val sex : Char = 'M'
val pwd : String = "张亮"

fun main() {

    common3().myLet {

    }

    sex.myLet {
        'M'
    }

    pwd.myLet {
        "李连杰"
    }
}

/**
 * 普通函数
 */
fun common3(){

}

1.6.3给高阶函数增加匿名函数

/**
 * 1.给高阶函数增加匿名函数
 * myMethod:T.(T)
 * R是返回值
 */
fun<T,R> T.myLet1(myMethod:T.(T)->R):R{
    //myMethod(this)
    return myMethod(this)
}
    //不让其返回it,而是this,则需要给高阶函数添加匿名函数
    common3().myLet1 {

    }

1.7控制器

1.7.1定义

/**
 * 1.如果你是true,我就执行你,否则不执行
 */
fun onRun(isRun:Boolean,myMethod:()->Unit){
    if(isRun){
        myMethod()
    }
}

1.7.2使用

fun main() {
    
    //1.调用写法1
    onRun(true){
        println("执行了")
    }

    //1.调用写法2
    onRun(true,{
        println("执行了")
    })

    //1.调用写法3
   var runVar =  Runnable {
        println("我是Runnable任务")
    }

    /**
     * 1.调用写法4
     * 1.1如果为真,则执行Runnable中的run函数
     */
    onRun(true,runVar::run)
}

2.打赏鼓励

感谢您的细心阅读,您的鼓励是我写作的不竭动力!!!

2.1微信打赏

在这里插入图片描述

2.2支付宝打赏

在这里插入图片描述

以上是关于11Kotlin项目实操之高阶函数二的主要内容,如果未能解决你的问题,请参考以下文章

09Kotlin项目实操之高阶函数一

09Kotlin项目实操之高阶函数一

08Kotlin项目实操之收藏业务

07Kotlin项目实操之Navigation使用

10Kotlin项目实操之首页模块

10Kotlin项目实操之首页模块