kotlin中的常见符号

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<Int?> = listOf(1, 2, null, 4)
val intList: List<Int> = 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)
}

推荐阅读更多精彩内容