1.匿名函数定义:匿名函数是指的没有函数名字的函数,例子如下:
fun main(){
val len ="kiiiing".count();
println(len)
val len2 ="kiiiing".count{
it =='i'
}
println(len2)
}
其中的"kiiiing".count{} 就是匿名函数,相当于一个表达式,有返回值,这个匿名函数内部是类型为char,变量名为it的字符,相当于把kiiing字符串分解
2.匿名函数的类型和隐式返回
例子如下:
fun main(){
//函数输入输出的声明
val methodAction :() ->String
//对上面函数的实现,这里是匿名函数,匿名函数没有返回值,即不需要写return,最后一行就是返回的内容
methodAction ={
"hello"
}
println(methodAction())
}
3.匿名函数参数的学习
对比上面拆解的方式定义一个匿名无参函数,下面是一个整合形式的有参匿名函数的定义:
fun main(){
val methodAction :(Int,Int,Int) ->String ={ n1, n2, n3->
"value is ${n1},${n2},${n3}"
}
println(methodAction(1,2,3))
}
4.匿名函数中it关键字的学习
fun main(){
//如果定义了一个参数的匿名函数,默认it参数名字
val methodAction2 : (String) ->String ={
it
}
}
5.匿名函数的类型推断
fun main(){
//匿名函数的返回值推断
val methdFunction ={ v1:Double, v2:Float, v3:Int ->
""
}
}
6.lambda的学习
fun main(){
//匿名函数 == lambda表达式
val addNumResult ={ number:Int, number2:Int ->
"两数相加的和:${number + number2}"
}
println(addNumResult(3,5))
//匿名函数返回Any类型,lambda表达式的参数Int, lambda表达式结果Any类型
val weekResumtMethod ={ number:Int ->
when(number) {
1 ->"星期一"
2 ->"星期二"
3 ->"星期三"
4 ->"星期四"
5 ->"星期五"
else -> -1
}
}
println(weekResumtMethod(3))
}
7.匿名函数中参数是函数的函数
fun main(){
loginApi("king","1234",responseResult = { reason:String,code:Int ->
println("登陆情况${reason}")
})
}
const val USER_NAME_SAVE_DB ="king"
const val USER_NAME_SAVE_PWD ="1234"
fun loginApi(username:String, userpassword:String, responseResult :(String,Int) ->Unit){
if(username ==null || userpassword ==null){
TODO("用户名密码为空")//出现问题,终止程序
}
if(username.length >3 && userpassword.length >3){
if(webServiceLoginApi(username,userpassword)){
//登陆成功
responseResult("login success",200);
}else{
//登陆失败
responseResult("login failed",400);
}
}else{
TODO("用户名密码不合格")
}
}
private fun webServiceLoginApi(name:String,passowrd:String) :Boolean{
return if(name ==USER_NAME_SAVE_DB && passowrd ==USER_NAME_SAVE_PWD){
true
}else{
false
}
}
8.匿名函数参数是函数的函数的简化写法
fun main(){
//第一种写法
loginApi2("king","1234",{ reason:String,code:Int ->
println("登陆情况${reason}")
})
//第二种写法
loginApi2("king","1234",responseResult = { reason:String,code:Int ->
println("登陆情况${reason}")
})
//第三种方式
loginApi2("king","1234"){ reason:String,code:Int ->
println("登陆情况${reason}")
}
}
9.匿名函数的内联学习
--如果一个函数的参数没有lambda,就不需要声明成内联
--如果一个函数的参数有lambda表达式
(1)如果一个函数不使用内联,在使用前会生成多个对象来完成lambda的调用
(2)如果一个函数使用内联,相当于c++中的宏定义,宏替换
结论:如果函数参数有lambda,尽量使用incline关键帧,内部会做优化,减少函数,对象开辟的损耗
10.函数引用
函数引用是指 把普通函数 变成 函数类型的对象
::函数名 可以转换成对象,一个函数lambda参数
fun main(){
loginApi("king","1234",::excuteResponseResult)
}
fun excuteResponseResult(reason:String,code:Int){
println("success")
}
const val USER_NAME_SAVE_DB4 ="king"
const val USER_NAME_SAVE_PWD4 ="1234"
fun loginApi3(username:String, userpassword:String, responseResult :(String,Int) ->Unit){
if(username ==null || userpassword ==null){
TODO("用户名密码为空")//出现问题,终止程序
}
if(username.length >3 && userpassword.length >3){
responseResult("login success",200);
}else{
TODO("用户名密码不合格")
}
}
11.函数类型作为返回类型
fun main(){
show("")
}
fun show(value:String) : (String,Int) ->String{
return {name:String,age:Int ->
""
}
}