先看一下图文
根据定义的性质可分为两类
非拓展函数
repeat 循环函数,可使用该函数执行一些有限循环任务,务必在构造函数传入循环次数 repeat(repeatNumber:Int = 1)
with 条件补充区域,可在某些需要两个或者多个函数对象直接的属性进行依赖操作时使用
伪代码
data class A(val number:Int)
data class B(val sex:String)
data class C(var school: String)
var b = B("女")
fun toDo(){
var a = A(1)
var result = with(b){
print("b= ${b.sex}")
}
print("result = $result")
}
// result = Kotlin.Unit
run 返回拓展函数区域的最后一行结果
fun toDo(){
var resultA = run{
"hell"
}
var resultB = run{
1
}
print($resultA $resultB)
}
// hell 1
拓展函数
apply 可以更改拓展函数的属性并返回该更改后的对象
var a = A("男")
var result = a.apply {
name = "女"
}
LogUtil.d(TAG, "a = $a result =$result")
//输出 a = A(name=女) result =A(name=女)
also 跟apply没什么区别就是属性调用要用 it
var a = A("男")
var result = a.also {
it.name = "女"
}
LogUtil.d(TAG, "a = $a result =$result")
// 输出 a = A(name=女) result =A(name=女)
let 拓展区域返回当前方法所需要的任意值 注意方法的定义类型和let return 返回的值必须是一至的
fun toDo(): String{
var a = A("男")
a.let {
if (it.name == "男"){
return "男子高中"
} else{
return "女子高中"
}
}
}
run 拓展性run函数无返回值,仅对拓展对象的属性进行操作
var a = A("男")
var result = a.run {
name = "女"
}
LogUtil.d(TAG, "a = $a result =$result")
// 输出 a = A(name=女) result =kotlin.Unit
最后,对于使用没有严格限制的公司来说,使用哪种拓展函数去更改属性都是没什么大问题的不用纠结,但是对于洁癖怪和一些特别讲究的人就要自行区分一些各个API的用途了,
比如 apply 字面意思就是应用 那就可以使用它去做一些属性赋值之类的操作
比如 also 字面意思是额外操作 那就可以使用它去做一些除了属性赋值以外的存储之类操作
比如 let 字面意思是允许 也就是放权的意思,再说白一点就是可以把一些业务实现由let拓展函数区域内去实现并且返回需要的值,而这个返回值是基于当前对象所在的方法定义的返回值,自此结束,如果你有什么高见或者见解可以放评论区大家相互提高一下水平