Kotlin提供了一些标准函数,旨在帮助开发人员简化代码,它是位于Standard.kt下的一些顶层函数
最简单的标准函数,两个参数第一个是一个int值,第二个参数是一个方法(方法参数是当前执行的index,没有返回值),功能是将该方法执行n次,每次index都会传入给方法
repeat(n){ index->
println("第$index次")
}
实例,往一个list中插入前20个奇数
val list = mutableListOf<Int>()
repeat(20){
list.add((it + 1) * 2 - 1)
}
println(list)
任何对象都可以调用,参数是一个Lambda表达式,功能是将调用对象作为参数传入Lambda表达式中,返回值是参数本身:
//result是经过Lambda操作之后对象obj
val result = obj.also{
it....
}
also最常见的使用方式是配合?.来判空
fun run(people: People?){
people?.also{
it.eat()
it.sleep()
it.work()
}
}
这样就不需要对people多次使用 ?.
fun run(people: People?){
people?.eat()
people?.sleep()
people?.work()
}
任何对象都可以调用,参数是一个Lambda表达式,功能和also类似,但是返回值是最后一行:
val result = obj.let {
it...
"result" //返回值赋值给result
}
let也可以用来判空,但是可以有返回值
fun run(people: People?){
val result = people?.let{
it.eat()
it.sleep()
it.work()
"people has done something"
}
}
任何对象都可以调用,参数是一个Lambda表达式,功能是为Lambda表达式内提供调用对象的上下文环境并且最后一行作为返回值返回。
val result = obj.run{
"result" //返回值赋值给result
}
run一般用来将要大量使用一个对象里面方法时使用,比如建造者构建对象时
val dialog = AlertDialog.Builder(BaseApplication.instance).run {
setTitle("对话框")
setIcon(R.drawable.ic_launcher_background)
setView(R.layout.activity_main)
create()
}
dialog.show()
with和run的功能一模一样,只是使用方式不同,它不再需要对象来调用,直接将所需的上下文环境对象作为第一个参数传入
val result = with(obj){
"result" //返回值赋值给result
}
使用with来构建对象时:
val dialog = with(AlertDialog.Builder(BaseApplication.instance)) {
setTitle("对话框")
setIcon(R.drawable.ic_launcher_background)
setView(R.layout.activity_main)
create()
}
dialog.show()
任何对象都可以调用,参数是一个Lambda表达式,功能和with、run差不多,也是为Lambda里提供上下文环境,只是不再将最后一行作为返回值返回,而是将调用者返回
//result是obj经过Lambda操作后的obj
val result = obj.apply{
//obj上下文
}
apply也可以和run、with那样用于建造者生成对象
val dialog = AlertDialog.Builder(BaseApplication.instance).apply {
setTitle("对话框")
setIcon(R.drawable.ic_launcher_background)
setView(R.layout.activity_main)
}.create()
dialog.show()
可以用来初始化一些对象
startActivity(Intent(context, MainJavaActivity::class.java).apply {
putExtra("name", "dean")
putExtra("age", 1)
})
任何对象都可以调用,参数是一个Lambda表达式,功能是通过最后一行(必须是boolean)来判断,如果是true返回自身,如果是false返回null
val result = obj.takeif{
(boolean表达式) 如果是true那么result就是经过Lambda操作后的obj,否则是null
}
实例:
代码:
fun main() {
val str = StringBuilder("你好").takeIf {
it.length > 5
}
println(str?.length ?: "str is null")
}
运行结果:
str is null
代码:
fun main() {
val str = StringBuilder("你好").takeIf {
it.append(" 中国!")
it.length > 5
}
println(str?.length ?: "str is null")
}
运行结果:
6
任何对象都可以调用,参数是一个Lambda表达式,功能和takeif刚好相反
val result = obj.takeUnless{
(boolean表达式) 如果是true那么result就是null,否则是经过Lambda操作后的obj
}
实例:
代码:
fun main() {
val str = StringBuilder("你好").takeIf {
it.length > 5
}
println(str?.length ?: "str is null")
}
运行结果:
2
代码:
fun main() {
val str = StringBuilder("你好").takeIf {
it.append(" 中国!")
it.length > 5
}
println(str?.length ?: "str is null")
}
运行结果:
str is null