在前面的两篇文章里面简单的介绍了关于kotlin的基础知识点,下面我们就来看一看kotlin更深一点的东西。对于前面两篇还没看过的同学,可以直接点击下面链接先去温习一下:
Android之kotlin篇(一)—— kotlin的基本使用
Android之kotlin篇(二)—— kotlin的基本使用
进入正题
kotlin之常用函数
kotlin之常用函数(let)
我们知道,kotlin中对null
的处理添加了支持,可以通过?
来支持空值,但是同时也意味着需要进行非空判断,关于对空值的处理看下下面这个例子:
//类型后面加?表示可为空
var age: String? = "23"
//抛出空指针异常
val ages = age!!.toInt()
//不做处理返回 null
val ages1 = age?.toInt()
//age为空返回-1
val ages2 = age?.toInt() ?: -1
除此之外,kotlin还内置了一个let函数来对空的处理。
// 使用Java
if( mVar != null ){
mVar.function1();
mVar.function2();
mVar.function3();
}
// 使用kotlin(无使用let函数)
mVar?.function1()
mVar?.function2()
mVar?.function3()
// 使用kotlin(使用let函数)
// 方便了统一判空的处理 & 确定了mVar变量的作用域
mVar?.let {
it.function1()
it.function2()
it.function3()
}
kotlin之常用函数(also)
类似let函数,但区别在于返回值:
let函数:返回值 = 最后一行 / return的表达式
also函数:返回值 = 传入的对象的本身
// let函数
var result = mVar.let {
it.function1()
it.function2()
it.function3()
999
}
// 最终结果 = 返回999给变量result
// also函数
var result = mVar.also {
it.function1()
it.function2()
it.function3()
999
}
// 最终结果 = 返回一个mVar对象给变量result
kotlin之常用函数(with)
调用同一个对象的多个方法 / 属性时,可以省去对象名重复,直接调用方法名 / 属性即可。
private fun withUse(): String {
val stringBuilder = StringBuilder()
return with(stringBuilder) {
for (letter in 'A'..'Z') {
append(letter)
}
append("\nNow I know the result")
toString()
}
}
kotlin之常用函数(run)
结合了let、with两个函数的作用,即:
(1)调用同一个对象的多个方法 / 属性时,可以省去对象名重复,直接调用方法名 / 属性即可
(2)定义一个变量在特定作用域内
(3)统一做判空处理
private fun runUse() {
val user = User("jack", 28, "13701659446")
val result = user.run {
println("my name is $name, I am $age years old, my phone number is $phone")
1000
}
println("result:$result")
val data = run {
Date()
}
println("date=$data")
}
// 最后打印结果
my name is jack, I am 28 years old, my phone number is 13701659446
result:1000
date=Wed Aug 25 15:54:16 CST 2021
kotlin之常用函数(apply)
与run函数类似,但区别在于返回值:
run函数返回最后一行的值 / 表达式
apply函数返回传入的对象的本身
private fun applyUse() {
val stringBuilder = StringBuilder().apply {
for (letter in 'A'..'Z') {
append(letter)
}
println(toString())
}
stringBuilder.append("\nNow I know the result")
println(stringBuilder.toString())
}
// 最后打印结果
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Now I know the result
最后总结对比一下: