1.null检查
1.1
private var am_btn: Button? = null
private var am_tv: TextView? = null
private fun initView() {
am_btn = findViewById(R.id.am_btn) as Button
//am_tv = findViewById(R.id.am_tv) as TextView
setListener()
}
private fun setListener() {
am_btn?.setOnClickListener {
am_tv?.text = "ssssss"
toast("sss")
}
}
例如上面代码,如果用传统java写法,当am_btn为null时,运行会直接闪退,得在am_btn.setOnclickListener前判空,如果不为空才能setListener,而用kotlin的?判空方式,直接在am_btn后加个?,意思是如果am_btn为Null,就不执行后面的setOnClickListener()方法了; 再看里面的am_tv.setText()方法,am_tv为null,程序依然会闪退,但是加了?检查后,如果am_tv为null,就不会执行后面的setText逻辑,不过下面一行的toast(“sss”)是会正常执行的。
1.2
private fun setListener() {
val a:Int? = null
val str = a?.toString() ?: "123"
am_btn?.setOnClickListener {
am_tv!!.text = "ssssss"
toast(str)
}
}
如果a为null或a.toString为null,str就赋值为”123”;
也可以这样用:
val myString = a?.toString() ?: return false
val myString = a?.toString() ?: throw IllegalStateException()
1.3
上面已经通过private var am_btn: Button? = null 声明这个am_btn变量是可Null变量了,所以下面在使用时如果不加任何检查,就会直接报错,不能通过编译,这时如果确定am_btn不为Null,可以写成这样跳过编译检查:
am_btn!!.setOnClickListener{ }
这样虽然可以编译通过,但是在运行时万一am_btn为null,程序依然会闪退。如果一份代码时充斥着!!,说明很多地方没有被正确处理。
1.4 let操作符
//Java
if (currentUser != null) {
text.setText(currentUser.name)
}
//instead Kotlin
user?.let {
println(it.name)
}
2.字符串模板
var a = 1
val s1 = "a is $a" //直接获取a的值
a = 2
val s2 = "${s1.replace("is", "was")}, but now is $a" //在大括号里可写表达式
println(s1)//a is 1
println(s2)//a was 1, but now is 2
3.条件判断
3.1 if
val a = 1
val b = 2
println(if (a>b) a else b)
输出a和b中大的值,因为if判断可以直接返回值,所以kotlin就用if直接代替了三元运算符了。
3.2 for
fun test3(args: Array<String>) {
for (name in args)//相当于java的增强for循环
println("Hello, ${name}!")
for (i in args.indices) {//带下标的for循环
println("Hello, ${args[i]}!")
}
}
3.3 when
fun test4(args: Array<String>) {
val args = arrayOf("FR","EN")
val language = if (args.isEmpty()) "EN" else args[0]
println(when (language) {
"EN" -> "Hello!"
"FR" -> "Salut!"
"IT" -> "Ciao!"
else -> "Sorry, I can't greet you in $language yet"
})
val listOf = listOf<Int>(0, 1, 2)
when {
1 in listOf -> println("found 1")
3 in listOf -> println("found 3")
}
}
运行结果:
Salut!
found 1
3.5 while
var i = 0
while (i < 5) {
println(i++)
}
3.6 ranges
fun test6(){
for (x in 1..3) {
print(x) //1 2 3
}
println()
for (x in 1..10 step 2) {
print(x)//13579
}
println()
for (x in 10 downTo 1 step 2) {
print(x)//10 8 6 4 2
}
}