结论先行
区别 | 返回值 | 内部操作 |
---|---|---|
let | 最后一行 | it |
apply | 调用者本身 | this |
also | 调用者本身 | it |
run | 最后一行 | this或省略 |
- 首先写一个Person类做演示,方便数据的展示。
- 其次对每个api写1到2个测试的方法,
看打印的log日志(注释上的即是)
class Person(var name: String, var age: Int) {
override fun toString(): String {
return "[姓名:$name ~ 年龄:$age]"
}
}
let
- 适合对一些需要探空的数据做扩展处理,
- 返回值是最后一行
- 内部使用it代替
//原始数据[姓名:张三 ~ 年龄:20]
//修改后数据[姓名:张三 ~ 年龄:30]
//二次let数据kotlin.Unit
fun test1(): Unit {
val person = Person("张三", 20)
val result = person.let {
println("原始数据${it.toString()}")
it.age = 30
println("修改后数据${it.toString()}")
it.age = 40
}.let {
println("二次let数据${it.toString()}")
}
return result
}
//原始数据[姓名:张三 ~ 年龄:20]
//修改后数据[姓名:张三 ~ 年龄:30]
//二次let数据[姓名:张三 ~ 年龄:40]
fun test01(): Person {
val person = Person("张三", 20)
val result = person.let {
println("原始数据${it.toString()}")
it.age = 30
println("修改后数据${it.toString()}")
it.age = 40
it
}.let {
println("二次let数据${it.toString()}")
it
}
return result
}
apply
- 返回值就是调用者本身
- 内部使用this代替
//原始数据[姓名:张三 ~ 年龄:20]
//修改后数据[姓名:张三 ~ 年龄:30]
//二次apply数据[姓名:张三 ~ 年龄:40]
fun test2(): Person {
val person = Person("张三", 20)
val result = person.apply {
println("原始数据${this.toString()}")
this.age = 30
println("修改后数据${this.toString()}")
this.age = 40
}.apply {
println("二次apply数据${this.toString()}")
}
return result
}
also
- 返回值就是调用者本身
- 内部使用it代替
//原始数据[姓名:张三 ~ 年龄:20]
//修改后数据[姓名:张三 ~ 年龄:30]
//二次also数据[姓名:张三 ~ 年龄:40]
fun test3(): Person {
val person = Person("张三", 20)
val result = person.also {
println("原始数据${it.toString()}")
it.age = 30
println("修改后数据${it.toString()}")
it.age = 40
}.also {
println("二次also数据${it.toString()}")
}
return result
}
run
- 返回值就是 最后一行
- 内部使用this代替
- 可以给调用者直接赋值 省去变量名
//原始数据[姓名:张三 ~ 年龄:20]
//修改后数据[姓名:张三 ~ 年龄:30]
//二次also数据kotlin.Unit
fun test4(): Unit {
val person = Person("张三", 20)
val result = person.run {
println("原始数据${toString()}")
age = 30
println("修改后数据${toString()}")
age = 40
}.run {
println("二次also数据${toString()}")
}
return result
}
//原始数据[姓名:张三 ~ 年龄:20]
//修改后数据[姓名:张三 ~ 年龄:30]
//二次also数据[姓名:张三 ~ 年龄:40]
fun test04(): Person {
val person = Person("张三", 20)
val result = person.run {
println("原始数据${toString()}")
age = 30
println("修改后数据${toString()}")
age = 40
this
}.run {
println("二次also数据${toString()}")
this
}
return result
}
takeIf
takeIf 判断条件成立 则执行
//年龄大于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 判断条件不成立 则执行
//年龄 不是 大于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()}")
}
}
网友评论