1.【?,?.,?:,!!,filterNotNull】可空类型与非空类型
【?可空类型】
在 Kotlin 中,类型系统区分一个引用可以容纳 null{: .keyword } (可空引用)还是不能容纳(非空引用)。
例如,String 类型的常规变量不能容纳 null{: .keyword }
var a: String = "abc"
a = null // 编译错误
如果我们定义的变量是一个可以为空的类型,则要用String?
var b: String? = "abc"
b = null // 编译通过
【?.安全调用操作符】
如果我们要获取字符串b的长度,则调用b.length,这时候编译器会报错
val l = b.length // 错误:变量“b”可能为空
val l = b?.length//ok,如果 b 非空,就返回 b.length,否则返回 null,{: .keyword },这个表达式的类型是 Int?。
【?:Elvis 操作符】
对于上面的例子,在开发中我们经常的操作是,当b不为空时,我们返回另一个值y,当b为空时,我们返回一个值x,而不是null,
这样就用到Elvis操作符
val l = b?.length?:-1//当b不为空时,返回b.length,当b为空时,返回-1
【!!操作符】
还有一种情况就是,如果我传的b为空,我希望系统直接给我抛出个NPE异常,就会用到!!操作符
val l = b!!.length//如果b不为空,则返回b.length,如果b为空,则抛出异常NullPointerException
【filterNotNull】
如果你有一个可空类型元素的集合,并且想要过滤非空元素,你可以使用 filterNotNull 来实现。
val nullableList: List = listOf(1, 2, null, 4)
val intList: List = nullableList.filterNotNull()
2.【$符号】
这个特别简单,也很好用,举个例子,开发中我们会常去拼接请求的url
------------java------------
String baseUrl = "http://www.baidu.com/"
String imageUrl = baseUrl+"?page=1&size=10"//当然这些数字不能写死,一般我们都是添加在FormBody中的
------------kotlin-------------
val imageUrl = "$baseUrl?page=$page&size=$size"
3.【==和===】
==判断值是否相等,===判断值及引用是否完全相等。
val num: Int = 128;
val a:Int? = num
val b:Int? = num
println(a == b) //true
print(a === b) //true
4.【..区间】
区间(或叫作范围)表达式由具有操作符形式 .. 的 rangeTo 函数辅以 in 和 !in形成。
if (i in 1..10) { // 等同于 1 <= i && i <= 10
println(i)
}
//使用until函数,创建一个不包括其结束元素的区间
for (i in 1 until 10) { // i in [1, 10) 排除了 10
println(i)
}
//如果你想倒序迭代数字呢?也很简单。你可以使用标准库中定义的 downTo() 函数
for (i in 4 downTo 1) print(i) // 输出“4321”
//能否以不等于 1 的任意步长迭代数字? 当然没问题, step() 函数有助于此
for (i in 1..4 step 2) print(i) // 输出“13”
for (i in 4 downTo 1 step 2) print(i) // 输出“42”
5.【_】
data class Book(var id: Int, var name: String)
Book声明了 id,name两个变量。解构时如果只需要id这一个变量时
val book = Book(1, "英语")
val (id, _) = book
6.【::】得到类的Class对象
//得到类的Class对象
startActivity(Intent(this@KotlinActivity, MainActivity::class.java))
7.【@】
1、限定this的类型
class User {
inner class State{
fun getUser(): User{
//返回User
return this@User
}
fun getState(): State{
//返回State
return this@State
}
}
}
2、跳出循环
loop@ for (itemA in arraysA) {
var i : Int = 0
for (itemB in arraysB) {
i++
if (itemB > 2) {
break@loop
}
println("itemB:$itemB")
}
}
3、命名函数自定义标签
fun fun_run(){
run {
println("lambda")
}
var i: Int = run {
return@run 1
}
println("$i")
//匿名函数可以通过自定义标签进行跳转和返回
i = run (outer@{
return@outer 2
})
println(i)
}