一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。
字符串模板
:日志打印
日常在java中打印日志会这样写:
Log.i("ChapterActivity", "onCreate: result = " + result + ", param = " + param);
但是通过+
拼接字符串的行为比较低效,会间接创建不少的中间String
对象。一般如果是使用很多个+
拼接的字符串的行为,是建议使用StringBuild
代替。 到了Kotlin这里更是提供了字符串模板
简化操作:
Log.i("ChapterActivity", "onCreate: result = $result, param = $param")
当然本质上还是通过+
拼接的字符串。
而且kotlin的字符串模板中可以执行其他的逻辑操作,比如return
:
fun test2(name: String?) {
Log.i("ChapterActivity", "test2: ${name ?: return}")
}
虽然可以这样操作,但是在日志中执行非打印信息的行为在我看来是不可取的
,主要是有两个原因:
- 可能创建无用对象 反编译下上面的代码:
首先创建了一个StringBuild
对象,当name
不为null打印日志。但是当name
为null
的时,这个创建的StringBuild
对象就没被用到,反而增加了内存开销
- 不利于维护 日志中存在控制代码逻辑的执行会增加维护成本,开发者后续维护时可能会忽略日志,导致后续可能发生异常。
运算符重载for in
遍历集合是一个非常普遍的行为:
fun test2() {
val list = listOf("tom", "lily", "meg", "joe")
for (item in list) {
}
}
反编译成java代码:
可以看到for in
的实现就是个迭代器Iterator
,并实现其hasNext
和next
方法。所以我们也可以自定义个迭代器实现for in
行为:比如打印当前类及其父类的所有public
方法名称
输出:
非常的简单方便,自定义迭代器Iterator
的行为在kotlin集合的扩展函数和sequence
中非常普遍,大家有兴趣可以自定看下源码。
vararg
可变参数
这个就类似于java中的XXX...
,比如String...
fun test5(vararg names: String) {
println(names.size)
}
test5("和", "的", "吧", "啊")
如果把vararg
转换成list
集合,需要添加个*
:
val list = listOf(*names)
我们可以看下vararg
的Java源码:
可以看到vararg names: String
就等价于于java的String...
,使用的时候就是把vararg
转换成了一个数组而已。