kotlin中的apply函数的对象赋值问题

32 篇文章 2 订阅
注:前面的主要是概念解释,源于《Kotlin实战》一书,apply的使用问题在最下面,如果对于with和apply的概念很熟悉可以直接看下面内容。 kotlin标准库中apply函数和with函数是带接受者的lambda。这两个函数可以使我们对同一对象执行多次操作,而不需要把对象的名称写出来。 #with 代码清单1:使用whith构建字母表
     fun alphabet(): String{
         val result = StringBuilder()
         for (letter in 'A'..'Z') {
             result.append(letter)
         }
         result.append("\nNow I know the alphabet!")
         return result.toString()
     }
下面是用with进行代码优化 代码清单2:
fun alphabet() = with(StringBuilder()) {
    for (letter in 'A'..'Z') {
        append(letter)
    }
    append("\nNow I know the alphabet!")
    toString()
}
由此可以发现 with可以消除清单1中对变量名字的显示引用,同时返回lambda的最后一个表达式的值。但是有时候我们想返回的是接受者对象,而不是结果时,这时候就需要使用apply了。 #apply apply的作用和with几乎一样,唯一区别是apply会始终返回作为实参传递给它的对象(换句话说,就是接受者对象)。下面是用apply进行重构刚才的alphabet函数。 代码清单3:
fun alphabet() = StringBuilder().apply {
    for (letter in 'A'..'Z') {
        append(letter)
    }
    append("\nNow I know the alphabet!")
}.toString()
在Android上使用的时候可以用这种方式对一些实例进行创建并初始化 代码清单4:
fun createViewWithCustomAttributes(context: Context) = 
    TextView(context).apply {
        text = "Sample Text"
        textSize = 20.0f
    }
至此,概念全部结束 *** 请看一下两段代码的运行结果: 代码清单5

fun main(args: Array<String>) {
    //sampleStart
    class User(var age: Int, var name: String)
    var u = User(11,"22")
    var u2 = User(22,"33")
    fun applyTest() = u.apply {
        u.age = u2.age
    }
    //sampleEnd

}
@Test
fun test(){
    println("----age:"+applyTest().age)
    println("----age:"+u.age)
    println("----age:"+u.age)
}
>>>----age:22
>>>----age:22
>>>----age:22
println("")

代码清单6:

class User(var age: Int, var name: String)
var u = User(11,"22")
var u2 = User(22,"33")
fun applyTest() = u.apply {
    u = u2
}
@Test
fun test(){
    println("----age:"+applyTest().age)
    println("----age:"+u.age)
    println("----age:"+u.age)
}
>>>----age:11
>>>----age:22
>>>----age:22

由此可以知道,如果直接在T.apply里面改变T的话,第一次运行是没有结果的(基本类型也是),但是如果这个变量是对象的话,并且改变的是对象里面的属性的话,第一次运行是有效果的。如果想让第一次改变对象有效果,需要在apply的函数体内,显示调用 return 返回这个对象,例如以下方式:

代码清单7:

class User(var age: Int, var name: String)
var u = User(11,"22")
var u2 = User(22,"33")
fun applyTest() = u.apply {
    u = u2
    return u
}
@Test
fun test(){
    println("----age:"+applyTest().age)
    println("----age:"+u.age)
    println("----age:"+u.age)
}
>>>----age:22
>>>----age:22
>>>----age:22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值