Kotlin 是一种静态编程语言
2011JetBrains开始开发Kotlin,用于多平台应用(能脱离虚拟机,直接编译成可以在win,mac,linux运行的二进制代码)
2017获得谷歌官方支持
语法简洁(减少了大量的样板代码,语法糖),提供了空安全、协程、函数式编程(高阶函数和 Lambda 表达式)、函数扩展等特性,并且与Java有良好的互操作性。缺点是相对年轻,缺少一些成熟的库和工具。
1.声明变量、常量
val声明只读变量
类型推断:
一些能够自己推断出类型。就不用写类型,比如 var age=5
常量需要写到函数外,否则报错:
const val MAX1=1
因为这些编译时就确定,放到函数里面,函数要执行了才确定。所以放到外面。
放到伴生对象里面也行,伴生对象类似静态。
2.数据类型
首字母都大写了,都是对象
Int , -2147483648
到2147483647
Java有基本和引用数据类型。
Kotlin只有引用,但是最后编译器会改为基本数据类型,提高效率。
3.分号没了
4.let with run apply also takeif takeunless
let 传入it,返回代码块结果
also 传入it,返回this
with 传入this,返回代码块结果
run 传入this,返回代码块结果
apply 传入this,返回this
takeif ,类似if。函数体内要返回ture或者false,类似if里面的ture或者false。如果true,执行后面
takeUnless,和上面类似,但是判断里面是false,才执行后面
5.@JvmOverloads等
几个都是用来java调用kotlin的?
@JvmOverloads
在有默认参数值的方法中使用@JvmOverloads注解,则kotlin会暴露多个重载方法。
参数都没有默认值,写了这个注解,那还是只有一个方法。
@JvmField
把类里面的成员变量暴露出来,不用get也能访问
@JvmName
改个别名
@JvmStatic
类型JvmField,暴露伴生对象
@Throws
解决Java和Kotlin的异常检查的差异
6.查看字节码
双击shift,输入show kotlin bytecode
Tools -> Kotlin -> Show Kotlin Bytecode。
7.条件语句
when
8.在什么范围 range
9.箭头符号 ->
箭头符号 ->
在 Kotlin 中扮演了多种角色,包括定义 Lambda 表达式、函数类型
val a: (Int) -> Int = { x -> x * x }
fun performOperation(x: Int, operation: (Int) -> Int): Int { return operation(x) }
10.函数声明
可以给函数默认参数
还有具名函数参数,就是给具体名字来写每个参数。就可以不按顺序了。
Unit类似void,它也是一个类型,不是 "没有类型"
TODO,不会只有提示,会直接异常中断,返回Nothing类型
函数名加反引号,避免两边语言关键字不一样导致取名取到对方不识别的函数名的问题,就可以相互愉快的访问了
给函数参数传 _ 下划线,表示不赋值
11.list set map
list
里面可以存任意类型
listOf可以创建,也可以直接大括号
有提供getOrElse getOrNull等函数
MutableList 是可变的list
两种列表可以相互转换
Set
无序不能重复
也有可变和不可变
Map
mapOf来创建
也有可变和不可变
12. 类
默认都是不可继承,需要继承,加open
默认给成员变量,生成get set
可以修改get set,用到field关键字。这个代表这个变量的引用?每个变量都有一个field
主构造函数:
直接写在类后面小括号里面,那只能传参数,不能有代码了
次构造函数:
用constructor
次构造必须要调用主构造才行。
初始化顺序:
init创建对象就会调用
lateinit,延迟初始化:
类似dart 的late。
惰性初始化:
config被用的时候,才会调用后面的函数
13.其他
解构 方便一次返回多个值
委托 ab类继承c类。 原来各自构造。 可以通过d类,来管理ab,都用他来构造
reified 知道泛型类型。
infix 语法糖。适用单个参数的函数。在函数前面加infix关键字,使用的时候就把 xxx.to(yyy) 变为 xxx to yyy
zip 合并两个集合,返回一个新集合
fold 合并
map 变换函数
返回:
flatMap
返回123456
filter 过滤
返回 Jack Jimmy
14.协程
是对线程封装的api,方便调用。单个线程内,性能一样
runblocking,launch,async多种方法
CoroutineScope
async和await结合使用
suspend 挂起。从当前线程脱离,进入另外一个线程。 在当前线程,就是挂起的状态。
15.Jetpack
官方提供的架构,框架
16. build.gradle.kts
用kotlin语言写的,用起来更方便
17.databinding
viewbinding 只是帮忙写了findViewById而已。 layout布局里面不需要做任何变动
databinding 写了findViewById,layout里面需要 layout和data的标签,默认只有初始数据设置了进去
observablefield 实现了数据变化了,edittext里面数据也一起变化 。用了它专门的set方法,set里面帮忙做了notifyChange。实现了数据Bean->页面的单向绑定
userViewModelByOb.nameOnlyOB.set("我是nameOnlyOB 更改后")
继承BaseObservable 和上面observablefield 实现的功能类似
加上等号 ,edittext的内容变化了,会同步改变了数据上面。实现页面-->Bean的数据单向绑定
livedata 多了一个observe方法,用LiveData包裹的数据String,可以监听它变化,变化了可以在observe里面做操作。Activity里面没有owner,AppCompatActivity才有
18.lifecycle
当我们自己写的一个类,需要在activity各个生命周期做操作时,这样代码就比较零散。
可以这样做:
然后activity添加一下观察者
这样就能拥有了生命周期监听能力。
另外还有这种方式,实现DefaultLifecycleObserver接口: