a === b 当且仅当 a 和 b 指向同一个对象时求值为 true。
如果为语句加上双感叹号:!! 那么则表示如果为空的话会抛出空指针异常错误。
Inline 关键字让高阶函数效率更高,特别是有循环时。
如果使用关键字当做变量,那么使用``包裹就可以了
Kotlin可变参数:vararg。
延迟初始化关键字:lateinit
if区间判断:if (x in 1..8) {
println("x 在区间内")
}when、if都可以拥有返回值
Kotlin所有的类都是Any的子类,Any和java中object相似,但两者并不是同一个类。
构造函数的参数可以使用高阶函数。
尽量不要在Activity中出现静态内部类,这样会导致Activity无法回收。
with()表达式很好用,可以多次调用某对象的方法与属性。
比类的构造函数更早加载的是类中的init代码块。
by lazy委托修饰类似于java中的synchronized。这个属性只在kotlin1.1之后才有。注意:只初始化一次!
val numFun: (a: Int, b: Int) -> Int
它不是一个普通的变量,它必须指向一个函数,并且函数签名必须一致。直接使用lambda表达式:
val sumLambda = {a: Int, b: Int -> a + b}
sumLambda(1, 2)
sumLambda是函数变量。将函数赋值给函数变量:
fun sum(a: Int, b: Int): Int {
return a + b
}
var numFun: (a: Int, b: Int) -> Int
numFun = ::sumKotlin有synchronized关键字,我们也可以使用Lock与ReentrantLock以及信号量等等来保证线程安全。
kotlin中annotation关键字是注解的类的关键字。
类可以标记为 inner ,可以使用外部类的对象创建内部类,不能直接使用外部类的类名直接进行创建内部类。如果不加inner,可以使用外部类的类名直接进行创建内部类,但是不能通过对象创建内部类。
参数可以使用if语句或者when语句补充,java中不允许这么做,但是在Kotlin中是可以的。
by lazy关键字只针对于val常量属性,如果是var则会报错。
双层循环,循环次数低的放在外层,高的放在里层,这样会提高运行速度。
关键字
companion object静态关键字
constructor 构造函数关键字
override 重写方法关键字
lateinit 延迟加载
inline 内敛属性
open 表明类可以被继承
基本数据类型:Boolean Byte Short Int Long Float Double Char
init 初始化
by lazy 延迟加载
vararg变长参数
set和get的真实操作值field。
annotation class Fancy 意思是修饰一个类为注解。user?.let {
println(it.name)
}
相当于如果user不为空则执行输出,let关键字。如果新建一个对象,特别是实体类,只为了初始化几个参数然后当本身当参数传进了方法里,那么建议使用
fun tt(text: Text) {}
fun text() {
tt(object : Text() {
init {
setAge("")
}
})
}
这种用法also和apply是kotlin自己的方法,使用它们可以对类做一些初始化,also使用it,apply使用this。
任何时候,如果我们只需要“一个对象而已”,并不需要特殊超类型,那么我们可以简单地写:
val adHoc = object {
var x: Int = 0
var y: Int = 0 }infix表达式让程序更加的简洁
// 给 Int 定义扩展
infix fun Int.shl(x: Int): Int { ......
}
// 用中缀表示法调用扩展函数 1 shl 2
// 等同于这样
1.shl(2)使用高阶函数时尽量使用内联函数关键字:inline ,这样会大幅度提升性能。
is操作符否定形式!is.
比较两个对象是否引用相等===,比较两个值是否相等==。
在 Kotlin 中使用 JNI
要声明一个在本地(C 或 C++)代码中实现的函数,你需要使用 external 修饰符来标记它:
external fun foo(x: Int): Double 其余的过程与 Java 中的工作方式完全相同。静态static就是缓存,Token就是以全局静态保存在服务器的。然后静态HashMap列表将token存入缓存。