11Kotlin项目实操之高阶函数二
Posted 清风百草
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11Kotlin项目实操之高阶函数二相关的知识,希望对你有一定的参考价值。
(1)一个人只要自己不放弃自己,整个世界也不会放弃你.
(2)天生我才必有大用
(3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟.
(4)做难事必有所得
(5)精神乃真正的刀锋
(6)战胜对手有两次,第一次在内心中.
(7)好好活就是做有意义的事情.
(8)亡羊补牢,为时未晚
(9)科技领域,没有捷径与投机取巧。
(10)有实力,一年365天都是应聘的旺季,没实力,天天都是应聘的淡季。
(11)基础不牢,地动天摇
(12)写博客初心:成长自己,辅助他人。当某一天离开人世,希望博客中的思想还能帮人指引方向.
(13)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~
【11】Kotlin项目实操之高阶函数二
文章目录
- 【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.2true表示高阶函数的返回值
*/
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项目实操之高阶函数二的主要内容,如果未能解决你的问题,请参考以下文章