kotlin练习 - 作用域函数学习

kotlin练习 - 作用域函数学习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

package com.kymjs.kotlinprimer.unit3


data class User(var name: String)

fun main(args: Array<String>) {

val user = User("ZhangTao")

//let与run都会返回闭包的执行结果,区别在于let有闭包参数,而run没有闭包参数
val letResult = user.let { "let::${it.javaClass}" }
println(letResult)
val runResult = user.run { "run::${this.javaClass}" }
println(runResult)

//also与apply都不返回闭包的执行结果,区别在于also有闭包参数,而apply没有闭包参数
user.also {
println("also::${it.javaClass}")
}.apply {
println("apply::${this.javaClass}")
}.name = "hello"

//takeIf 的闭包返回一个判断结果,为false时,takeIf函数会返回空
//takeUnless 与 takeIf 刚好相反, 闭包的判断结果,为true时函数会返回空
user.takeIf { it.name.length > 0 }?.also { println("姓名为${it.name}") } ?: println("姓名为空")
user.takeUnless { it.name.length > 0 }?.also { println("姓名为空") } ?: println("姓名为${user.name}")

//重复执行当前闭包
repeat(5) {
println(user.name)
print(it)
}

//with比较特殊,不是以扩展方法的形式存在的,而是一个顶级函数
with(user) {
this.name = "with"
}
// 类似于 user.apply{ this.name = "with"}
}

let

  • 定义:

    fun <T, R> T.let(block: (T) -> R): R

  • 功能:

    调用对象(T)的let函数,则该对象为函数的参数。在函数内可以通过 it指代该对象。返回值为函数的最后一行或指定return表达式。

  • 实例:

1
2
3
4
5
6
7
8
9
10
11
fun main(args: Array<String>) {
val data = "孙悟空"
data.let {
//在函数体内使用it替代object对象去访问其公有的属性和方法
println(it.toString())
}
data?.let {
// 假如data不为null,代码会执行到此处
println(it.toString())
}
}

with

  • 定义:

    fun <T, R> with(receiver: T, block: T.() -> R): R

  • 功能:

    将对象作为函数的参数,在函数内可以通过this指代该对象。返回值为函数的最后一行或return表达式。

  • 实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fun main(args: Array<String>) {
var list = with(mutableListOf<String>()) {
add("1")
add("2")
add("3")
//返回值为函数的最后一行或return表达式
this
}
println(list.toString())//[1, 2, 3]
}

fun main(args: Array<String>) {
var paint = Paint()
with(paint) {
color = Color.BLACK
strokeWidth = 1.0f
textSize = 18.0f
isAntiAlias = true
}
}

apply

  • 定义:

    fun T.apply(block: T.() -> Unit): T

  • 功能:

    调用对象的apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象。

  • 实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fun main(args: Array<String>) {
// apply适用于那些对象初始化需要给其属性赋值的情况。
var list = mutableListOf<String>().apply {
add("1")
add("2")
add("3")
//apply返回的是对象本身
}
println(list.toString())//[1, 2, 3]
}

fun main(args: Array<String>) {
//apply需要先初始化
var paint = Paint().apply {
color = Color.BLACK
strokeWidth = 1.0f
textSize = 18.0f
isAntiAlias = true
}
}

run

  • 定义:

    1. fun run(block: () -> R): R
    2. fun <T, R> T.run(block: T.() -> R): R
  • 功能:

    调用run函数返回值为函数体最后一行,或return表达式。

  • 实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
fun main(args: Array<String>) {
var list = mutableListOf<String>().run {
add("1")
add("2")
add("3")
//run返回的是函数体最后一行,或return表达式
this
}
println(list.toString())//[1, 2, 3]
}

fun main(args: Array<String>) {
var name = run {
"孙悟空"
}
println(name)//孙悟空
}

repeat

  • 定义:

    fun repeat(times: Int, action: (Int) -> Unit)

  • 功能:

    重复执行action函数times次,times从0开始

  • 实例:

1
2
3
4
5
6
7
8
9
10
11
12
fun main(args: Array<String>) {
repeat(3){
//从0开始循环3次
println("repeat:第${it}次")
}
for(i in 0..2){
println("for:第${i}次")
}
(0..2).forEach{
println("forEach:第${it}次")
}
}

also

  • 定义:

    fun T.also(block: (T) -> Unit): T

  • 功能:

    调用对象的also函数,在函数块内可以通过 it指代该对象,返回值为该对象本身。(注意其和let函数的区别,let返回的是最后一行,also返回的是对象本身)

  • 实例:

1
2
3
4
5
6
7
8
fun main(args: Array<String>) {
var list = mutableListOf<String>().also {
it.add("1")
it.add("2")
it.add("3")
}
println(list.toString())//[1, 2, 3]
}

takeIf

  • 定义:

    fun T.takeIf(predicate: (T) -> Boolean): T?

  • 功能:

    传递一个函数参数,如果函数结果为true,返回T对象,否则返回null。

  • 实例:

1
2
3
4
5
6
7
8
9
10
fun main(args: Array<String>) {
var list = mutableListOf<String>("1", "2", "3").takeIf {
it.size > 3//满足条件则返回it,否则返回null
}
if (list != null) {
println(list.toString())
} else {
println("list为空")
}
}

takeUnless

  • 定义:

    fun T.takeUnless(predicate: (T) -> Boolean): T?

  • 功能:

    与takeIf相反,参数函数返回false时返回T对象,否则返回null

  • 实例:

1
2
3
4
5
6
7
8
9
10
fun main(args: Array<String>) {
var list = mutableListOf<String>("1", "2", "3").takeUnless {
it.size > 3//不满足条件则返回it,否则返回null
}
if (list != null) {
println(list.toString())
} else {
println("list为空")
}
}