本文收集各处看到的 kotlin 小技巧及实用点.
一些 Kotlin 小技巧及解析
plus 操作符
利用 plus (+) 和 minus (-) 对 Map 集合做运算
1 | val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3) |
Map 集合的默认值
1 | val map = mapOf( |
注意: withDefault 和 plus 操作符在一起用,有一个 bug:
1 | val newMap = map + mapOf("python" to 3) |
通过 plus(+) 操作符合并两个 map,返回一个新的 map, 但是忽略了默认值,
使用 require 或者 check 函数作为条件检查
1 | // 传统的做法 |
区分和使用 run, with, let, also, apply
函数 | 是否是扩展函数 | 函数参数(this、it) | 返回值(调用本身、最后一行) |
---|---|---|---|
with | 不是 | this | 最后一行 |
T.run | 是 | this | 最后一行 |
T.let | 是 | it | 最后一行 |
T.also | 是 | it | 调用者本身 |
T.apply | 是 | this | 调用者本身 |
使用 T.also 函数交换两个变量
1 | int a = 1; |
b.also { b = a } 会先将 a 的值 (1) 赋值给 b,此时 b 的值为 1,然后将 b 原始的值(2)赋值给 a,此时 a 的值为 2,实现交换两个变量的目的。
三种单例的实现方式
使用 Object 实现单例
1 | object WorkSingleton |
编译后的 java 文件:
1 | public final class WorkSingleton { |
使用 by lazy 实现单例
1 | class WorkSingleton private constructor() { |
可接受参数的单例
但是有的时候,希望在单例实例化的时候传递参数,例如:
1 | Singleton.getInstance(context).doSome() |
第一种和第二种方式都不能满足, 用下面的方式:
1 | class WorkSingleton private constructor(context: Context) { |
并且不限制传入参数的类型,凡是需要传递参数的单例模式,只需将单例类的伴随对象继承于 SingletonHolder,然后传入当前的单例类和参数类型即可,例如:
1 | class FileSingleton private constructor(path: String) { |