刚学kotlin的时候,发现语法和java差不多,但是有些小符号很有意思。
fun find(name : String) : A ?
??
加在变量名后,系统在任何情况不会报它的空指针异常。
!!?
加在变量名后,如果对象为null,那么系统一定会报异常。
举例 java写法:
ArrayList<String myList = null; // 创建一个null的队列
Log.d("TAG", "-->> List Size = " + myList.size());
在执行到log打印队列长度的时候,会报空指针错误
而在ktolin中在调用 myList
的时候在它后面加上一个问号 myList?.size()
,则会在 myList
为null 的时候直接打印出null(注意不是0) ,不会抛出 NullPointerException
。
上述java写法转为ktolin:
val myList: ArrayList<String? = null // 创建一个null的队列
Log.d("TAG", "-->> List Size = " + myList!!.size)
这样就证明了 !!
会对对象进行非空判断,并且会像 java 代码一样当对象为空时抛出异常。
对象A ?: 对象B 表达式,意思为:当对象 A值为 null 时,那么它就会返回后面的对象 B。
举例:
val studentList: ArrayList<Student>? = null
if(studentList?.size ?: 0 > 0){
println("list不为空")
}
使用上面的 ?和 ?: 就可以避免程序中出现的 NullPointerException 。
表示把一个方法当做一个参数,传递到另一个方法中进行使用,也就是引用一个方法。
class ColonMagic {
fun main(msg: Array<String>) {
//调用peopleDo方法,并传入参数 “I say !” 和 say方法体
//此处 ::say 是将say方法作为参数传入peopleDo方法
//此处只是将say作为参数,而不会调用say方法,也就不会println(message),不会输出日志
peopleDo("I say !", ::say)
}
/**
* 一个参数
* message:String类型
*/
private fun say(message: String) {
println(message)
}
/**
* 两个参数
* msg: String类型
* dosay: (String) -> Unit 一个参数为String不需要返回值的方法体
*/
private fun peopleDo(msg: String, doSay: (String) -> Unit) {
//doSay(msg)调用的就是传入的say方法,即say(msg),只不过参数名是doSay本质是say方法
//此处打印出来 I say ! 日志
doSay(msg)
}
}
=
就是赋值,
==
表示比较两个值大小,
===
表示比较对象地址。
fun main(args: Array<String) {
val a : Int = 1000
println(a == a) //true
println(a === a) //true
val a1 : Int = a
val a2 : Int = a
println(a1 == a2) //true
println(a1 === a2) //true
}
fun main(args: Array<String) {
val a : Int = 1000
println(a == a) //true
println(a === a) //true
val a1 : Int? = a
val a2 : Int? = a
println(a1 == a2) //true
println(a1 === a2) //false
}
解释:
如果我们使用的是??val a : Int = 999
这种方式,这时的a其实就是个数值,不涉及装箱的问题,也就不是对象。 而如果我们使用的是??val a: Int? = 999
这种方式,这时的a是一个Int型对象,因为它涉及到装箱问题。