前戏
- 原理:kotlin作为一门语言,有独立语法,然后有专门编译器编译成class,所以和java完全兼容,最终都有java虚拟机解释。
- 用kotlin代码看java代码
- 打开目标 Kotlin 文件
- 看 Kotlin 字节码:Tools –> Kotlin –> Show Kotlin ByteCode
- 在 字节码页点击左上角的 decompile 按钮,看 Java 文件
- 2011年JetBrains设计开发。
- 测试运行方式:自家IDE、web在线工具、AS
- 简洁。很多东西都可以考虑省掉。
基础
- 变量
- var,(variable)可变变量
- val,(value)不可变变量
- 所有数字都继承Number
- 所有类型都是包装类(首字母大写)
- 函数
- 语法:修饰 fun 函数名(参数:类型)返回值{}。其中修饰可省,默认public;参数可省;返回值可省;函数体只有一行时,大括号可省;
public fun justDoIt (var a:Int?,var b:String) Int {}// 完整写法
fun justDoIt = 单行语句 // 最贱写法
- 类
- 普通类。class xxx (var a:Int){}
- 数据类。data class xxx
- 可继承类。open class xxx {}
- 单例类。object xxx {}
- 创建时,抛弃new
- 继承
1. (var a:Int)为A类的主构造函数
2. constructor声明次级构造函数,且必须继承主构造函数
如 constructor():this(1),次级构造函数可以传递,类似自定义view时候
3. 如果主构造函数只有次造函数,需要继承父类构造函数
class A:B{
constructor():super()
}
- 遍历for-in。抛弃for-i
for(v in 1..10)//[1,10]
for(v in 1 until 10)//[1,10)
for(v in 1 until 10 step x)//跳步
for(v in 10 downTo 1)// 降序
-
集合及遍历
- list。listOf() 不可变集合;mutableListOf() 可变集合
listOf('a','b')
for(v in list){}
- set。setOf() 不可变集合;mutablesettOf() 可变集合
- map。mapOf() 不可变集合;mutablemapOf() 可变集合
mapOf('k1' to v1,'k2' to v2)
for((key,value) in map){}
-
控制语句
- if 可作为返回值,每一个条件的最后一行作为返回值
- while。和java完全一致。
- when 类似switch,语法:
when(value){// 其中value和括号可以挪进匹配语句处
匹配语句-> {}
else->{}
}
-
空指针
- 任何时候类型后边加?表示可空,不加即不可空
- ?. 空则不执行
- !!. 空也执行且报错
- a ?: b。a不空则返回a,否则返回b
-
字符串内插入语句: ${}
中级
- lambda
- 语法:{参数1:类型,参数n:类型-> 函数体},本质上就是一小段可以调用的代码块
- 如果lambda作为最后一个参数,可以写在()外
- 如果lambda只有一个入参,可以省略如此,函数体内用it代替入参
- 如果lambda是最后一个入参,其本身只有一个入参,可以直接省略
button.setOnclikListerter{
}
- 高阶与内联函数
- 高阶函数:函数的入参是函数。简洁高级,已读不易懂,性能开销大。函数被对象化,
- 内联函数:inline修饰,函数体代替对象,inline修饰的函数及传入的lambda都是内联函数,除非明确表明
- 原生内联函数let、with、run、apply、also
obj.let{}或者obj?.let{}
with(obj){}
obj.run或者apply或者also{}
1. let 用it代表对象,返回最后一行
2. with 用this代表对象,可省,返回最后一行
3. let+with=run 用this代表对象,可省,返回最后一行
4. apply约等于run,返回当前对象
5. also 用it代表对象,返回当前对象
inline fun justDoIt(val a:Int,do1:(b)->b,noinline do2:(c)->c){}
- 协程
|