第一个正式使用kotlin,kotlin减少了很多new set get等方法,直接=即可,用起来十分简洁,以下是自己在此项目使用中经常用到的几个知识点,简单记录一下,方便之后查阅。
一、非空机制
1. 类型后面加?表示可为空
var a: String? = null
if (a == null) {
println("a is null")
} else {
println(a)
}k
2. 变量后面加!!,可抛出控指针异常
3. 变量后面加?,不做处理返回 null,相当于java直接if判空,写法简单
4. 返回值后面加?:,为空时返回
val a = null
val aa= age?.toInt() ?:-1
5. 当一个引用可能为 null 值时, 对应的类型声明必须明确地标记为可为 null
fun toInt(str: String): Int? {
// ...
}
6.let函数
当你需要去定义一个变量在一个特定的作用域范围内,let函数的是一个不错的选择;let函数另一个作用就是可以避免写一些判断null的操作。
adaper?.isShow?.let {
if (it) {
setEidt(true)
} else {
setEidt(false)
}
}
let,with,run,apply,also函数区别
函数名 | 定义inline的结构 | 函数体内使用的对象
| 返回值 | 是否是扩展函数 | 适用的场景 |
let | fun <T, R> T.let(block: (T) -> R): R = block(this) | it指代当前对象 | 闭包形式返回 | 是 | 适用于处理不为null的操作场景 |
with | fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block() | this指代当前对象或者省略 | 闭包形式返回 | 否 | 适用于调用同一个类的多个方法时,可以省去类名重复,直接调用类的方法即可,经常用于Android中RecyclerView中onBinderViewHolder中,数据model的属性映射到UI上 |
run | fun <T, R> T.run(block: T.() -> R): R = block() | this指代当前对象或者省略 | 闭包形式返回 | 是 | 适用于let,with函数任何场景。 |
apply | fun T.apply(block: T.() -> Unit): T { block(); return this } | this指代当前对象或者省略 | 返回this | 是 | 1、适用于run函数的任何场景,一般用于初始化一个对象实例的时候,操作对象属性,并最终返回这个对象。 |
also | fun T.also(block: (T) -> Unit): T { block(this); return this } | it指代当前对象 | 返回this | 是 | 适用于let函数的任何场景,一般可用于多个扩展函数链式调用 |
二、方法的可见性
default,public:能见到类声明的
private:相同class可见
protected:相同class及子类可见
internal:能见到类声明的 本模块内 的任何客户端都可见
三、类
1.类的创建和构造方法 Kotlin 构造器关键字 constructor 声明, 如果没有可见性、注解等修饰,可省略 constructor。和 Java 具有构造函数不一样, Kotlin的构造器只有声明, 初始化代码可放到 init 块。
class WebUrlBaseDbBean(url: String, title: String) {
private val mUrl: String
private val mTitle: String
init {
mUrl = url
mTitle = mTitle
}
}
Java 可以为类定义多个构造函数, Kotlin 也可以, 但不一样的是, Kotlin 的构造器有主次之分。Kotlin只有一个主构造器,如上代码所示就是主构造器, 次级构造器必须直接或者间接调用主构造器,示例:
class WebUrlBaseDbBean (url: String, title: String) {
constructor(url: String): this(url, “11”)
}
主构造器不能带函数体,次级构造器可带函数体。如果主构造器没有参数,可省略,编译器会自动生成无参构造器。
class WebUrlBaseDbBean {
private var url: String? = null
contructor(url: String) {
this. url = url
}
init {
// do something
}
}
2、静态方法与变量
使用companion object {} 包裹的,就是静态方法和字段
3、继承
Kotlin 类可以继承 open 的类和接口, 如果没有继承,默认继承 Any, Any 相当于 Java 的 Object 类, 是所有类的基类。
和 Java 不同, Kotlin 类默认是 final 的, 要允许被继承,需要显式声明为 open,抽象类默认是 open 的。
类的方法也类似, 允许被重载需要 open 声明。
4、参数的默认有getter 和 setter,不用定义
三、集合
创建(只读方式:不可增删元素)
val listBook = listOf<String>(“11”, “22”, “33”, “44”, “55”)
增删元素(转换成以下三个才可以)
MutableList
MutableSet
MutableMap
Kotlin 构造器关键字 constructor 声明, 如果没有可见性、注解等修饰,可省略 constructor。和 Java 具有构造函数不一样, Kotlin的构造器只有声明, 初始化代码可放到 init 块。
四、协程
特点:
使用方便,不使用回调实现线程切换,使用同步方式写出异步代码
所有的耗时任务保证一定放在后台执行
挂起函数执行完毕之后,协程会把它切换到原先的线程的线程。
Dispatchers.Main 调用程序在Android的主线程中
Dispatchers.IO 适合主线程之外的执行磁盘或者网络io操作,例如文件的读取与写入,任何的网络请求
Dispatcher.Default 适合主线程之外的,cpu的操作,例如json数据的解析,以及列表的排序,
GlobalScope.launch {
val delList= DbHelper.getFavoritenDao().loadAll()
DbHelper.getFavoritenDao().deleteAll()
FavoriteRequestManager.getInstance().delCollect(delList,null)
FavoriteReceiver.refreshData(ContextUtils.getAppContext())
}