本篇主要是用于学习Kotlin 时 记录一些关于代码的理解
一 将函数类型作为参数
private fun test(a:Int, b:(num1:Int, num2:Int)->Int):Int{
return a+b.invoke(3,5);
}
定义一个函数 参数为 a int类型,b 是一个函数 类型 并且该函数
参数必须为两个int 返回值必须为int 至于里面怎么操作 看你传入的函数来定
如何调用
test(1,{a,b->a-b}
这里{} 里面即定义了一函数 ,参数为 a,b 当然这两个变量可以随便起 。
箭头后面是你函数内部的执行逻辑 你可以相加 相乘 总之 这两个变量为int
你的计算结果也必须为int
相当于test 搞了一个函数 参数 限定了 这个函数 的返回值和参数 至于这个函数
怎么计算 由调用者决定
二 函数作为返回值
fun getNum(type: Int): (lo: Int) -> Int {
if (type == 1) {
return { prin -> prin + prin }
} else {
return { num -> num * num }
}
}
定义一个函数 返回值为一个函数。。 这个函数的参数为int。返回值为int。这个返回的函数内部的逻辑
在return 里面实现 。。。如果type 是1 则是一个相加的函数
如果不是1 是一个相乘的函数
lo 为参数名。prin。num 都是 参数名 他们指代的都是 函数参数 起什么名字都无所谓
如何使用
var function = getNum(1);//返回了一个函数。。。
var result = function(1); //调用这个返回的函数 得到一个int 值
三 apply 函数
textView?
.apply {
setText("123")
}
.apply {
setOnClickListener(
{
Toast.makeText(applicationContext
,"",Toast.LENGTH_LONG).show()
}) }
apply 函数返回了调用者自身 所以可以链式 调用。。 分布执行逻辑
四 Let 函数
val original = "abc"
original.let {
Log.i("xx",it); abc
it.reversed() // 改变值传递到下一链条
}.let {
Log.i("xx",it); cab
it.length // 改变类型
}.let {
Log.i("xx","xxx$it“); 3
}
let 函数 返回的是调用者本身 计算以后的值。。 会改变。
五 also 函数
also 函数与 apply 差不多
also 也是返回自身 与let不同 let 会返回改变的值 所以 可以利用 let 与also 结合 比如
fun makeDir(path: String) = path.let{
File(it)
}.let{
it.mkdirs()
}
如果都用let。那么这个函数的返回值 就是bool。因为最后一步 是it.mkdirs. 这个计算的结果是boolean
但是如果你还想要file 对象 可以改成
fun makeDir(path: String) = path.let{
File(it)
}.also{
it.mkdirs()
}
这样 also 返回的还是 file 对象。
六 T.run 函数。
fun runTest(path:String)=
path?.
run {
var a=1+2
a
}.
run {
Log.i("xx","最后一个是$this")// this 就是a 所以输出 3
}
T.run 返回的是 范围内最后一个对象 所以 这里第二个run 的this 其实是a
T.run 可以对T 进行非空校验
推荐一个写的非常好的 博客 里面 解释的很详细。
https://juejin.im/post/6844903554625323015
盗用下 上面的图 对这些函数 如何取舍