kotlin 作用域函数

192 阅读1分钟
1,apply和also

这两个函数的相同点是,函数都会返回调用者自身,区别是apply用this作为参数,而also用it作为参数
用法:

fun main(args: Array<String>) {
    val list = listOf(1, 2, 3, 4, 5, 6, 7)
     /**
     * println
     *   list.size = 7
     *   list.size = 7
     */   
    list.apply { println("  list.size = $size ") }
        .also { println("  list.size = ${it.size} ") }
}
2,run和let

这两个函数的相同点是,函数都不会返回调用者自身,而是返回大括号内方法体的执行结果
区别是run用this作为参数,而let用it作为参数
用法:

fun main(args: Array<String>) {
    val list = listOf(1, 2, 3, 4, 5, 6, 7)
    /**
     * println
     *   list.size = true
     *   size 7
     */
    list.run { size > 0 }.also { println("  list.size = $it ") }

    val size = list.let { it.size }
    println("  size $size ")
}

3,takeIf 和 takeUnless

takeIf :大括号内的函数体返回false,则函数会返回null,大括号内的函数体返回true,则函数会返回自身
takeUnless:和takeIf相反
用法:

fun main(args: Array<String>) {
    val list = listOf(1, 2, 3, 4, 5, 6, 7)
    /**
     * println
     * takeIf it.size > 0  size = [1, 2, 3, 4, 5, 6, 7]
     * 返回值为nul,所以未打印
     * takeUnless it.size > 0  size = [1, 2, 3, 4, 5, 6, 7]
     * 返回值为nul,所以未打印
     */
     list.takeIf { it.size > 0 }?.apply { println(" takeIf it.size > 0  size = $this ") }
     list.takeIf { it.size < 0 }?.apply { println(" takeIf it.size > 0  size = $this ") }

     list.takeUnless { it.size > 0 }?.apply { println(" takeUnless it.size > 0  size = $this ") }
     list.takeUnless { it.size < 0 }?.apply { println(" takeUnless it.size > 0  size = $this ") }
}
4,with

with:顶级函数,适合对同一个对象做多次操作

fun main(args: Array<String>) {
    val list = arrayListOf<Int>(1, 2, 3, 4, 5, 6, 7)
    /**
     * println
     * list = [3, 2, 3, 14, 5, 6, 7]
     */
    with(list) {
        this[0] += 2
        this[3] += 10
    }
    println("  list = $list ")
}