你需要懂的Kotlin开发技巧之八-灵析社区

德州安卓

字符串模板:日志打印

日常在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打印日志。但是当namenull的时,这个创建的StringBuild对象就没被用到,反而增加了内存开销

  • 不利于维护
    日志中存在控制代码逻辑的执行会增加维护成本,开发者后续维护时可能会忽略日志,导致后续可能发生异常。

运算符重载for in

遍历集合是一个非常普遍的行为:

fun test2() {
    val list = listOf("tom", "lily", "meg", "joe")
    for (item in list) {
    }
}

反编译成java代码:

可以看到for in的实现就是个迭代器Iterator,并实现其hasNextnext方法。所以我们也可以自定义个迭代器实现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转换成了一个数组而已。

阅读量:1102

点赞量:0

收藏量:0