原理: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 继承
class A(var a:Int):B(){}
1. (var a:Int)为A类的主构造函数
2. constructor声明次级构造函数,且必须继承主构造函数
如 constructor():this(1),次级构造函数可以传递,类似自定义view时候
3. 如果主构造函数只有次造函数,需要继承父类构造函数
class A:B{
constructor():super()
}
初始化用init{} 遍历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,
inline fun justDoIt(val a:Int,do1:(b)->b,noinline do2:(c)->c){}
协程


