县城做信息网站,网站的电子画册怎么做,手机登qq电脑版入口,广东网站制作哪家强一、概述
为了帮助您根据使用场景选择合适的作用域函数#xff08;scope function#xff09;#xff0c;我们将对它们进行详细描述并提供使用建议。从技术上讲#xff0c;许多情况下范围函数是可以互换使用的#xff0c;因此示例中展示了使用它们的约定俗成的做法。
1.…一、概述
为了帮助您根据使用场景选择合适的作用域函数scope function我们将对它们进行详细描述并提供使用建议。从技术上讲许多情况下范围函数是可以互换使用的因此示例中展示了使用它们的约定俗成的做法。
1.let函数 上下文对象作为参数it提供。 返回值lambda表达式结果.
let可以用于在调用链的结果上调用一个或多个函数。例如
var name kotlin
var sub name.substring(0,2)
println(sub)
用let重写上面的例子不用分配一个新的变量就会直接输出结果:
var name kotlin
name.substring(0,2).let {println(it)
}
let代码块里如果只有一个函数且函数只有一个参数it可以用::代替it参数
var name kotlin
name.substring(0,2).let(::println)
let代码块里操作的数值为非空值为了操作非空数值需要在let前用?.操作符
val name: String? null
name?.let {println(it)
}
为了让代码更用阅读可以自定义变量代替it参数
val name: String kotlin
val child: String? name.substring(0, 2)
child?.let { sub -println(sub)//sub为自定义的变量代替it参数
}
2.with函数 上下文对象作为接收者this可用。 返回值lambda表达式结果. with 不是一个扩展函数上下文对象this作为参数传递在lamda表达式里this可以被当作接收者.
当不需要返回结果时推荐用with时可以引用上下文对象调用方法。例如
val name kotlin
with(name){println(this)
}
可以在lamda代码块里引用上下文对象的属性和函数例如
val name kotlin
println(result:${with(name) {length substring(0, 2).length}}
)
3.run函数 上下文对象作为接收者this可用。 返回值lamda表达式结果
run 跟with作用相同但run是一个扩展函数。像let对象可以通过点符号引用run。当lamada表达式中同时有初始化和计算操作可用run函数。例如
class User{var name: String? nullvar age 0}User().run {name javaage 99Log.d(TAG,User:$name,$age)}
你还可以将 run 作为非扩展函数来调用。run 的非扩展版本没有上下文对象但它仍然返回 lambda 表达式的结果。非扩展的 run 允许你在需要表达式的地方执行多个语句的代码块。在代码中非扩展的 run 可以理解为“运行代码块并计算结果”。例如 var name cname.run {var y 123println($this,$y)}
4.apply函数 上下文对象作为接收者this可用。 返回值this对象本身.
因为 apply 函数返回引用对象本身主要用于对象的成员操作时可用apply函数。主要应用appply函数的地方是对象的配置。对apply调用可以被当作是对象的初始化。
class User {var name: String? nullvar age 0fun set(ageParam: Int) {age ageParam}fun get(): Int {return age}}User().apply {name javaage 99set(100)Log.d(TAG, User:$name,${get()})}
另一个 apply 的使用场景是将其包含在多个调用链中以进行更复杂的处理。例如
class User {var name: String? nullvar age 0fun set(ageParam: Int) {age ageParam}fun get(): Int {return age}}User().apply {name javaage 99set(100)Log.d(TAG, User:$name,${get()})}.apply {name cLog.d(TAG, User:$name,${get()})}
5.also函数 上下文对象作为参数(it)提供. 返回值引用对象本身
also 用于操作上下文参数对象。引用also的操作都是针对引用对象而不是它的属性和方法或者是不想对外部作用域隐藏this对象。
常用于链式调用中在不改变对象的情况下插入一些中间操作。
当看到also时可以读作“also跟随对象”。
User().also {it.set(100)Log.d(TAG,also引用,user:${it.age})}.also {it.set(99)it.name kotlin}.run {Log.d(TAG,run引用user$name, $age)}
二、区别
1.参数
自定义参数it名字唯独let函数可以自定义参数it名字
函数参数传递唯独with函数把引用对象作为参数输入例如withname{}
2.返回值
letwith和run返回值为lamda表达式结果而apply和also返回值为引用对象本身
3.参数this和it
参数为this的函数为withrun和apply可直接操作对象的属性和方法。
参数为it的函数为不能直接操作对象的属性和方法。 推荐文章
Scope functions | Kotlin Documentation