val name = target.ifEmpty { “dhl” }
复制代码
其原理跟我们使用 if 表达式是一样的,来分析一下源码。
public inline fun <C, R> C.ifEmpty(defaultValue: () -> R): R where C : CharSequence, C : R =
if (isEmpty()) defaultValue() else this
复制代码
ifEmpty
方法是一个扩展方法,接受一个 lambda 表达式 defaultValue ,如果是空字符串,返回 defaultValue,否则不为空,返回调用者本身。
除了 ifEmpty
方法,Kotlin 库中还封装很多其他非常有用的字符串,例如:将字符串转为数字。常见的写法如下所示:
val input = “123”
val number = input.toInt()
复制代码
其实这种写法存在一定问题,假设输入字符串并不是纯数字,例如 123ddd
等等,调用 input.toInt()
就会报错,那么有没有更好的写法呢?如下所示。
val input = “123”
// val input = “123ddd”
// val input = “”
val number = input.toIntOrNull() ?: 0
复制代码
避免将解构声明和数据类一起使用
这是 Kotlin 团队一个建议:避免将解构声明和数据类一起使用,如果以后往数据类添加新的属性,很容易破坏代码的结构。我们一起来思考一下,为什么 Kotlin 官方会这么说,我先来看一个例子:数据类和解构声明的使用。
// 数据类
data class People(
val name: String,
val city: String
)
fun main(args: Array) {
// 编译测试
printlnPeople(People(“dhl”, “beijing”))
}
fun printlnPeople(people: People) {
// 解构声明,获取 name 和 city 并将其输出
val (name, city) = people
println(“name: ${name}”)
println(“city: ${city}”)
}
复制代码
输出结果如下所示:
name: dhl
city: beijing
复制代码
随着需求的变更,需要给数据类 People 添加一个新的属性 age。
// 数据类,增加了 age
data class People(
val name: String,
val age: Int,
val city: String
)
fun main(args: Array) {
// 编译测试
printlnPeople(People(“dhl”, 80, “beijing”))
}
复制代码
此时没有更改解构声明,也不会有任何错误,编译输出结果如下所示:
name: dhl
city: 80
复制代码
得到的结果并不是我们期望的,此时我们不得不更改解构声明的地方,如果代码中有多处用到了解构声明,因为增加了新的属性,就要去更改所有使用解构声明的地方,这明显是不合理的,很容易破坏代码的结构,所以一定要避免将解构声明和数据类一起使用。当我们使用不规范的时候,并且编译器也会给出警告,如下图所示。
[图片上传失败…(image-bb59b4-1594646872317)]
文件的扩展方法
Kotlin 提供了很多文件扩展方法 Extensions for java.io.Reade
: