函数的学习笔记###
/**
* DESC : kotlin语言的简略写法学习
* java中写法参考KtBaseFunTestJava03.java
*/
class KtBaseFunTest03 {
companion object {
const val TAG = "KtBaseFunTest03"
}
/**
* 其中 回调函数名字 参数 返回类型
* loginCallback : (String ,Int) -> Unit)
*/
private fun login(username: String, password : String,
loginCallback : (String ,Int) -> Unit) {
if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
TODO("登陆失败") //出现问题,终止程序
}
if ("admin".equals(username) && "123456".equals(password)) {
loginCallback("login success", 200)
} else {
loginCallback("login fail", 100)
}
}
/**
* 函数中回调函数的三种写法
*/
fun testLogin() {
//第一种写法
login("admin", "123456", { msg: String, code: Int ->
Log.d(TAG, "登陆结果:msg="+msg+",code="+code)
})
//第二种写法
login("admin", "123456", loginCallback = { msg: String, code: Int ->
Log.d(TAG, "登陆结果:msg=$msg ,code=$code")
})
//第三种写法(kotlin推荐写法)
login("admin", "123456") { msg: String, code: Int ->
Log.d(TAG, "登陆结果:msg=${msg} ,code=${code}")
}
}
/**
* inline 内联函数
* 此函数有使用lambda表达式作为参数(loginCallback : (String ,Int) -> Unit 此参数为lambda表达式),
* 就需要使用inline内联函数
*
* 原因如下:
* 如果此函数不使用inline,在调用端,会生成多个对象完成lambda的调用(会造成性能损耗)
* 如果使用inline,这样内部会做优化,减少函数开辟,对象开辟,减少性能损耗
*
* 通过Tools -> Kotlin -> Show kotlin bytecode -> decompiled转成java文件查看
*
* 没有使用inline,会再创建一个对象(Function2)null.INSTANCE实例
* public final void testLogin2() {
* this.login2("admin", "123456", (Function2)null.INSTANCE);
* }
*
*/
private inline fun login2(username: String, password : String,
loginCallback : (String ,Int) -> Unit) {
if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
TODO("登陆失败") //出现问题,终止程序
}
if ("admin".equals(username) && "123456".equals(password)) {
loginCallback("login success", 200)
} else {
loginCallback("login fail", 100)
}
}
fun testLogin2() {
login2("admin", "123456", { msg: String, code: Int ->
Log.d(TAG, "登陆结果:msg=" + msg + ",code=" + code)
})
}
/**
* 函数引用
* lambda属于函数类型的对象,需要把loginCallback 普通函数变成 函数类型的对象(函数引用)
*/
fun testFunUse01() {
/**
* 函数对象 普通类型的函数名
* val callback = ::loginCallback
*/
val callback = ::loginCallback
login2("admin", "123456", callback)
}
fun loginCallback(msg: String, code: Int) {
Log.d(TAG, "登陆结果:msg=" + msg + ",code=" + code)
}
/**
* 函数类型作为返回类型
*/
fun testFunReturn01() {
//valShowResult1是函数showResult1的返回值类型,为Boolean类型
val valShowResult1 = showResult1("hello world")
//valshowNestFunResult1是函数showNestFunResult1的返回值类型,只不过这个返回值依然是个函数
val valshowNestFunResult1 = showNestFunResult1("函数的返回值类型为匿名函数")
Log.d(TAG, ""+valShowResult1.toString())
//valshowNestFunResult1是函数,调用需要传参
Log.d(TAG, ""+valshowNestFunResult1("zhangs",78))
}
fun showResult1(info : String) : Boolean {
Log.d(TAG, "结果 info=${info}")
return true
}
fun showNestFunResult1(info : String) : (String, Int) -> Boolean{
//return 返回一个匿名函数
return { name :String, age:Int ->
Log.d(TAG, "结果 info=${info} ,参数name="+name+",age="+age)
true
}
}
}
网友评论