note
val 是一个不能重新赋值的变量 var 则可以 kotlin的类型推断是在编译时确定的 不能对一个普通类型赋值为Null,但是在后面加问号则表示这个类型是nullable类型,即可以设置为null
大括号,会返回最后的语句执行结果,可以直接赋值
但是这样不够清晰,可以用when语句代替:
方法可以直接被语句赋值:
匿名方法:
高阶函数(higher order functions),允许方法参数:
类属性的默认访问权限是public
迁移kotlin: 1、兼容: 只需要创建一个新的kotlin文件,会有提示点击配置即可。 2、转化: 选中java文件 > 工具栏 > code > convert .. 转化只是从字节码层面等同,但是实际的结果代码还需自己优化(比如有些变量虽然没有声明时初始化,但是使用的时候肯定是有値的情况。kotlin会在声明时设置为nullable,而每次使用时解包装(unwrap))
在kotlin中,声明变量时必须初始化,否则使用lateinit关键字,比如最常见的view初始化
SAM可以缩写:
java的静态,用companon object{}关键字代替static:
java本身是没有是否为空的严格类型的,所以kotlin调用java的类型时,可能出现无法判断是普通类型还是可空类型。!是一个适用此情况的平台类型,如String!,同时表示String和String? 当然如果加了@Nonnull注解,会被解析成String;@Nullable会被解析成String?
对于null,有更为快速的Elvis运算符:
该运算符还可以用于更早的return:
初始化区域:
协调器
coroutine 是一个并发设计模式。。 这里讲到需要放到子线程的不仅仅是网络请求和数据库操作(Dispatchers.IO -- disk or network), 甚至应该包括json解析,大列表循环(Dispatchers.Default -- CPU) 但是并没有给出具体的影响时间,只是说可能影响到jank就要。
主要是suspend 关键字,他不是回调,而是真正的阻塞协调器,在具体操作结束的时候再resume(这里需要看一发原理),这样一个明显好处是,不需要考虑回调方法所在的线程是否和调用方不一致。 而控制线程的方法是withContext(Dispatchers...), 它则对多次线程调用的创建做了优化,不会每次都创建;同样的对线程切换也有优化。(简单理解成一个线程池就是了。。)
制定协调器作用域(CoroutineScope)
主要用来控制coroutine的开始和取消,但是Dispatchers启动coroutine coroutine被取消的时候会产生一个CancellationException异常 如果一个协调器启动另一个协调器,那么他们有相同的作用域。 (viewModelScope)
启动
launch 不会返回值 async 会返回值,配合await/awaitAll(async会在某个时间调用await,相应的会把异常传递给await,这样就有可能无法在日志中获取异常信息)
如果在调用async的方法返回前不调用await方法,那么coroutine会在操作执行完之后才停止
kotlin和java交互指南
kotlin调用java
java中需要注意的 1、不能有kotlin的 hard keywords,不然需要倒引号来转义 2、除非必须,否则禁止使用Any的拓展方法或者拓展属性的名字,因为同名的成员或者域名会覆盖Any的。 3、公用部分的参数、返回等一定要添加nullability注解,否则会被解释成! 4、SAM参数最好放在最后,可以简略书写 5、getter,setter标准写成:getPro,setPro,isPro 6、方法命名不要和操作符重载方法的名称相同
java调用kotlin
风格指南
Last updated
Was this helpful?