分类 安卓 下的文章

如果我们想用for in 去遍历一个类。可参重构他的iterator 方法

class Animal(val name: String)

class Zoo(val animals: List<Animal>) {

    operator fun iterator(): Iterator<Animal> {             // 1
        return animals.iterator()                           // 2
    }
}

fun main() {

    val zoo = Zoo(listOf(Animal("zebra"), Animal("lion")))

    for (animal in zoo) {                                   // 3
        println("Watch out, it's a ${animal.name}")
    }

}

所有功能跟also都一样。唯一不同的就是域内使用this调用

fun main(args : Array<String>){
    var v1 = V()
    v1.apply{
        this.name = "fd"
    }.t1("hi")
}

class V {
    var name = "fd"
    
    fun t1(v:String){
        println("test1 $v $name")
    }
}

also就是*.let ,只不过。这域的返回值是also对象本身。不再是最后一行

fun main(args : Array<String>){
    var v1 = V()
    v1.also{
        it.name = "fd"
    }.t1("hi")
}

class V {
    var name = "fd"
    
    fun t1(v:String){
        println("test1 $v $name")
    }
}

let就跟*.run一样。必须有对象,并且这对象会带进匿名函数里,名字叫it

fun main(args : Array<String>){
    var v1 = "fd"
    var v2:String?
    
    v2 = v1?.let{
        it + " hi"
    }
    
    println(v2)
}

run
可以將 run 想像成一個獨立出來的 Scope , run 會把最後一行的東西回傳或是帶到下一個 chain。
第一個例子像是:
(就是弄一个作用域出来,更SB一点做法就像if(true){})

fun main(args : Array<String>){
    val test = "fd"
    run{
        val test = "fd2"
        println("test2 $test")
    }
    
    println("test1 $test")
}

输出:
test2 fd2
test1 fd

2.*.run 就是省略前某对象名字。直接调用他的属性或方法:

fun main(args : Array<String>){
    var v:V? = V()
    v?.name = "fd"
    v?.run{
        v.t1("hi")
    }
}

class V {
    var name = "fd"
    
    fun t1(v:String){
        println("test1 $v $name")
    }
}

3.run 是支持返回值的

fun main(args : Array<String>){
    val v1 = run{
        "xxx yyy"
    }
    
    println(v1)
}

4.组合作用

fun main(args : Array<String>){
    println("hi run:" + run{
        "hahaha run"
    })
    
    run{
        var v = V()
        v.name = "fd"
        println("test2 ${v.name}")
        v // 这个对象。作为返回对象
    }.t1("vvvv")
}

class V {
    var name = "fd"
    
    fun t1(v:String){
        println("test1 $v $name")
    }
}