Kotlin实用技巧

Kotlin实用技巧

三月 01, 2022

version 0.1

前言:

现在主力语言已经完全迁移至Kotlin,日常除了维护老的一些业务模块外,基本全都是Kotlin了。我认为Kotlin是一门偏向生产,提高码字效率的语言。很多时候Kotlin便捷的语法糖能给编程带来更丝滑的体验,但Kotlin依旧有很多的语法糖并不是那么的想当然。这些语法糖多数时候是很甜的,但也可能导致一些不好排查的问题,所以打算写一篇记录一下。

集合越界判空

1
2
val list = emptyList<String>()
val result = list?.get(1) ?: ""

之前真有过,刚接触的时候乍一看没什么问题啊,无脑?就行。结果遇到集合这种还是要判断越界的,那么又if-else,这时候用getOrNull()代替

1
2
3
public fun <T> List<T>.getOrNull(index: Int): T? {
return if (index >= 0 && index <= lastIndex) get(index) else null
}

inline noinline crossline

首先写两个方法,打印日志 其中doSomethingElse 是一个被嵌套在doSomething中的Unit 类型

1
2
3
4
5
6
7
8
9
fun doSomething() {
print("doSomething start")
doSomethingElse()
print("doSomething end")
}

fun doSomethingElse() {
print("doSomethingElse")
}

然后传统的crossline做法优化嵌套我们都知道, 但有的时候还真不能随便加.
当嵌套的方法有类似return之类的返回时要格外注意:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fun doSomething() {
print("doSomething start")
doSomethingElse {
print("doSomethingElse")
return // notice this return
}
print("doSomething end")
}

inline fun doSomethingElse(abc: () -> Unit) {
// I can take function
// do something else here
// execute the function
abc()
}

在不看字节码情况下,这个return的作用到底会产生什么后果的确是个容易忽略的点,要知道return的作用范围.这段代码的字节码如下?:

1
2
3
4
public void doSomething() {
System.out.print("doSomething start");
System.out.print("doSomethingElse");
}

可以看到,并没有end的打印输出后续.

这个时候就要加入crossinline来配合,避免”非本地返回”

1
2
3
4
5
6
inline fun doSomethingElse(crossinline abc: () -> Unit) {
// I can take function
// do something else here
// execute the function
abc()
}

@JvmOverload注解

其实没有太多好说,只是很多时候利于旧代码模块在调用新的类方法时候可以简化一些东西,安卓中其中一个常用场景在自定义view中可以省略很多:

1
2
3
4
class CustomView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0) : RelativeLayout(context, attrs, defStyleAttr) {}

更新日志:

版本 时间 说明
version 0.1 2022年04月11日 初版整理