結(jié)論先行
區(qū)別 | 返回值 | 內(nèi)部操作 |
---|---|---|
let | 最后一行 | it |
apply | 調(diào)用者本身 | this |
also | 調(diào)用者本身 | it |
run | 最后一行 | this或省略 |
- 首先寫一個Person類做演示尘盼,方便數(shù)據(jù)的展示。
- 其次對每個api寫1到2個測試的方法势决,
看打印的log日志(注釋上的即是)
class Person(var name: String, var age: Int) {
override fun toString(): String {
return "[姓名:$name ~ 年齡:$age]"
}
}
let
- 適合對一些需要探空的數(shù)據(jù)做擴(kuò)展處理,
- 返回值是最后一行
- 內(nèi)部使用it代替
//原始數(shù)據(jù)[姓名:張三 ~ 年齡:20]
//修改后數(shù)據(jù)[姓名:張三 ~ 年齡:30]
//二次let數(shù)據(jù)kotlin.Unit
fun test1(): Unit {
val person = Person("張三", 20)
val result = person.let {
println("原始數(shù)據(jù)${it.toString()}")
it.age = 30
println("修改后數(shù)據(jù)${it.toString()}")
it.age = 40
}.let {
println("二次let數(shù)據(jù)${it.toString()}")
}
return result
}
//原始數(shù)據(jù)[姓名:張三 ~ 年齡:20]
//修改后數(shù)據(jù)[姓名:張三 ~ 年齡:30]
//二次let數(shù)據(jù)[姓名:張三 ~ 年齡:40]
fun test01(): Person {
val person = Person("張三", 20)
val result = person.let {
println("原始數(shù)據(jù)${it.toString()}")
it.age = 30
println("修改后數(shù)據(jù)${it.toString()}")
it.age = 40
it
}.let {
println("二次let數(shù)據(jù)${it.toString()}")
it
}
return result
}
apply
- 返回值就是調(diào)用者本身
- 內(nèi)部使用this代替
//原始數(shù)據(jù)[姓名:張三 ~ 年齡:20]
//修改后數(shù)據(jù)[姓名:張三 ~ 年齡:30]
//二次apply數(shù)據(jù)[姓名:張三 ~ 年齡:40]
fun test2(): Person {
val person = Person("張三", 20)
val result = person.apply {
println("原始數(shù)據(jù)${this.toString()}")
this.age = 30
println("修改后數(shù)據(jù)${this.toString()}")
this.age = 40
}.apply {
println("二次apply數(shù)據(jù)${this.toString()}")
}
return result
}
also
- 返回值就是調(diào)用者本身
- 內(nèi)部使用it代替
//原始數(shù)據(jù)[姓名:張三 ~ 年齡:20]
//修改后數(shù)據(jù)[姓名:張三 ~ 年齡:30]
//二次also數(shù)據(jù)[姓名:張三 ~ 年齡:40]
fun test3(): Person {
val person = Person("張三", 20)
val result = person.also {
println("原始數(shù)據(jù)${it.toString()}")
it.age = 30
println("修改后數(shù)據(jù)${it.toString()}")
it.age = 40
}.also {
println("二次also數(shù)據(jù)${it.toString()}")
}
return result
}
run
- 返回值就是 最后一行
- 內(nèi)部使用this代替
- 可以給調(diào)用者直接賦值 省去變量名
//原始數(shù)據(jù)[姓名:張三 ~ 年齡:20]
//修改后數(shù)據(jù)[姓名:張三 ~ 年齡:30]
//二次also數(shù)據(jù)kotlin.Unit
fun test4(): Unit {
val person = Person("張三", 20)
val result = person.run {
println("原始數(shù)據(jù)${toString()}")
age = 30
println("修改后數(shù)據(jù)${toString()}")
age = 40
}.run {
println("二次also數(shù)據(jù)${toString()}")
}
return result
}
//原始數(shù)據(jù)[姓名:張三 ~ 年齡:20]
//修改后數(shù)據(jù)[姓名:張三 ~ 年齡:30]
//二次also數(shù)據(jù)[姓名:張三 ~ 年齡:40]
fun test04(): Person {
val person = Person("張三", 20)
val result = person.run {
println("原始數(shù)據(jù)${toString()}")
age = 30
println("修改后數(shù)據(jù)${toString()}")
age = 40
this
}.run {
println("二次also數(shù)據(jù)${toString()}")
this
}
return result
}
takeIf
takeIf 判斷條件成立 則執(zhí)行
//年齡大于19歲:[姓名:張三 ~ 年齡:20]
//takeIf最后一行返回:[姓名:張三 ~ 年齡:40]
fun test5() {
val person = Person("張三", 20)
person.takeIf { it.age > 19 }.let {
println("年齡大于19歲:${it.toString()}")
it!!.age = 40
it
}.let {
println("takeIf最后一行返回:${it.toString()}")
}
takeUnless
takeUnless 判斷條件不成立 則執(zhí)行
//年齡 不是 大于21歲:[姓名:張三 ~ 年齡:20]
//takeUnless最后一行返回:[姓名:張三 ~ 年齡:40]
fun test05() {
val person = Person("張三", 20)
person.takeUnless { it.age > 21 }.let {
println("年齡 不是 大于21歲:${it.toString()}")
it!!.age = 40
it
}.let {
println("takeUnless最后一行返回:${it.toString()}")
}
}