Kotlin:高阶函数,Android中为什么需要Handler

本文探讨了Kotlin中高阶函数的使用,如run、with、apply、also、let、takeIf、takeUnless等,以及它们在Android开发中的应用场景,特别是如何在不需要Handler的情况下进行异步操作。通过示例展示了这些函数如何简化代码和提高可读性,对于Android开发者提升代码质量有指导意义。
摘要由CSDN通过智能技术生成

输出结果:

str = java
str = kotlin

用法2:

因为run函数执行了我传进去的lambda表达式并返回了执行的结果,所以当一个业务逻辑都需要执行同一段代码而根据不同的条件去判断得到不同结果的时候。可以用到run函数

例:都要获取字符串的长度。

val index = 3
val num = run {
when(index){
0 -> “kotlin”
1 -> “java”
2 -> “php”
3 -> “javaScript”
else -> “none”
}
}.length
println(“num = $num”)

输出结果为:

num = 10

3.2.2、T.run()

其实T.run()函数和run()函数差不多,关于这两者之间的差别我们看看其源码实现就明白了:

public inline fun <T, R> T.run(block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}

从源码中我们可以看出,block()这个函数参数是一个扩展在T类型下的函数。这说明我的block()函数可以可以使用当前对象的上下文。所以当我们传入的lambda表达式想要使用当前对象的上下文的时候,我们可以使用这个函数。

例:

val str = “kotlin”
str.run {
println( “length =  t h i s . l e n g t h "   ) p r i n t l n (   " f i r s t   =   {this.length}" ) println( "first =  this.length)println( "first = {first()}”)
println( “last = ${last()}” )
}

输出结果为:

length = 6
first = k
last = n

在其中,可以使用this关键字,因为在这里它就代码str这个对象,也可以省略。因为在源码中我们就可以看出,block()就是一个T类型的扩展函数。

这在实际的开发当中我们可以这样用:

例: 为TextView设置属性。

val mTvBtn = findViewById(R.id.text)
mTvBtn.run{
text = “kotlin”
textSize = 13f

}

3.3 、with()函数

其实with()函数和T.run()函数的作用是相同的,我们这里看下其实现源码:

public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return receiver.block()
}

这两个函数的区别在于:

  1. with是正常的高阶函数,T.run()是扩展的高阶函数。
  2. with函数的返回值指定了receiver为接收者。

例:实现上面的T.run()函数的列子

val str = “kotlin”
with(str) {
println( “length = 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值