【11】Kotlin项目实操之高阶函数二
(1)一个人只要自己不放弃自己,整个世界也不会放弃你.
(2)天生我才必有大用
(3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟.
(4)做难事必有所得
(5)精神乃真正的刀锋
(6)战胜对手有两次,第一次在内心中.
(7)好好活就是做有意义的事情.
(8)亡羊补牢,为时未晚
(9)科技领域,没有捷径与投机取巧。
(10)有实力,一年365天都是应聘的旺季,没实力,天天都是应聘的淡季。
(11)基础不牢,地动天摇
(12)写博客初心:成长自己,辅助他人。当某一天离开人世,希望博客中的思想还能帮人指引方向.
(13)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~
【11】Kotlin项目实操之高阶函数二
文章目录
- 【11】Kotlin项目实操之高阶函数二
- 1.使用高阶函数
- 1.1完成高阶登录
- 1.1.1在函数形参中定义高阶函数
- 1.1.2在函数形参中使用别名定义高阶函数
- 1.1.3高阶函数的调用
- 1.2有返回值但无具体实现的高阶函数
- 1.2.1在函数参数中定义有返回值无实现的高阶函数
- 1.2.2调用
- 1.2.3高阶函数作为形参传递
- 1.2.4高阶函数无参但有返回值
- 1.2.5高阶函数调用(无参但有返回值)
- 1.3给泛型增加扩展函数
- 1.3.1扩展函数定义
- 1.3.2定义普通函数
- 1.3.3给普通函数添加扩展函数并调用扩展函数
- 1.3.4扩展函数中使用高阶函数
- 1.3.5简写为一行
- 1.3.6将泛型T指定为高阶函数
- 1.4 给泛型添加扩展函数
- 1.5给Context添加一个toast
- 1.5.1定义
- 1.5.2使用
- 1.6泛型T作为高阶函数参数
- 1.6.1定义
- 1.6.2使用
- 1.6.3给高阶函数增加匿名函数
- 1.7控制器
- 1.7.1定义
- 1.7.2使用
- 2.打赏鼓励
- 2.1微信打赏
- 2.2支付宝打赏
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 = 0fun 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 就是 thisreturn 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.调用写法1onRun(true){println("执行了")}//1.调用写法2onRun(true,{println("执行了")})//1.调用写法3var runVar = Runnable {println("我是Runnable任务")}/*** 1.调用写法4* 1.1如果为真,则执行Runnable中的run函数*/onRun(true,runVar::run)
}
2.打赏鼓励
感谢您的细心阅读,您的鼓励是我写作的不竭动力!!!
2.1微信打赏
2.2支付宝打赏
【11】Kotlin项目实操之高阶函数二相关推荐
- 【Kotlin】Kotlin 语言集合中的高阶函数详解 ( 数据类 data class | maxBy | minBy | filter | map | any | count | find )
文章目录 I . List 集合高阶函数引入 II . Kotlin 数据类 ( data class ) III . Java 代码 与 Kotlin 代码实现对比 ( 查询年龄最大的 ) IV . ...
- Kotlin实战指南八:高阶函数
转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/87969098 本文出自[赵彦军的博客] 高阶函数 any all count n ...
- Kotlin小知识之高阶函数
文章目录 高阶函数 定义高阶函数 函数类型 高阶函数示例 内联函数 内联函数的作用 内联函数的用法 noinline与crossinline 高阶函数 定义高阶函数 高阶函数和Lambda的关系是密不 ...
- Python学习日志10 - 高阶函数和高级应用
Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 前言 进入正题 Python学习日志10课 - 高阶函数 ...
- 一天一个小知识:KT高阶函数
让我们从匿名函数聊起 我们听说过有匿名类,那作为一等公民的函数就也会有匿名函数 什么是一等公民? 我们知道Java的一等公民是类,就连一个普通的程序入口也要用类包一下.而kotlin中除了类是一等公民 ...
- 函数 tostring_Kotlin实战之Fuel的高阶函数
Fuel 是一个用 Kotlin 写的网络库,与 OkHttp 相比较,它的代码结构比较简单,但是它的巧妙之处在于充分利用了 Kotlin 的语言特性,所以代码看上去干净利落. OkHttp 使用了一 ...
- [译]Effective Kotlin系列之探索高阶函数中inline修饰符(三)
简述: 不知道是否有小伙伴还记得我们之前的Effective Kotlin翻译系列,之前一直忙于赶时髦研究Kotlin 1.3中的新特性.把此系列耽搁了,赶完时髦了还是得踏实探究本质和基础,从今天开始 ...
- Python17_项目实操关卡-人机PK
项目实操关卡-人机PK 通过实战去成长,这体现在:能在学习初期就知道什么是关键知识,了解专业程序员一般是怎么思考和解决问题的,在一遍遍分析问题.拆解问题及解决问题的过程中真正地理解知识,并用这些知识来 ...
- Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
- Kotlin使用高阶函数实现多方法回调
最近项目中开始使用kotlin,遇到的一个问题就是从多方法回调的问题 常规的java回调如下: public interface OnCallBack<T> {void onSuccess ...
最新文章
- 进程的用户栈和内核栈
- 腾讯视频如何移出其他观看腾讯视频的设备
- C++类的定义和对象的创建
- 笛卡尔函数_笛卡尔,伯克利和函数式React式编程
- 有关Oracle最大连接数的问题
- html 标签 anki,为什么不建议使用Anki模板里的标签?
- vSAN架构解析与6.7功能介绍
- 摄影测量学——空间后方交会
- 在真机上 模拟GPS
- linux系统 锐捷_锐捷校园网Linux客户端认证xrgsu
- PDF编辑器(widsmob pdfedit)v3.0.1
- upf模板,来自synopsys rm golden.upf
- 急需小米笔记本TM1709最新版BIOS Firmware,当前是版:RMRKB5R0P0504 日期:2018/09/04 多谢帮助!
- 【和76】龙头企业在区域市场中竞合关系分析样例(温微观察13-6)
- 转载:技术大停滞——范式春梦中的地球工业文明:前言
- c语言中的output用法,OUTPUT 子句
- 算法:去除英文文本中重复单词
- php 去除汉字,php如何去除汉字
- GIS大数据可视化分析工具
- WIFI 认证加密模式介绍