常用操作符
1尺棋、? 操作符</br>
表示對象可能為空简僧,或者對象可以為空
//在變量之后加上 ?唆途,則代表變量可以為空
var name: String? = null
//加在函數返回值類型后邊硬贯,表示函數方法返回值可以為空
fun getName(): String? {
....
}
//如果 b非空焕襟,就返回 b.length ,否則返回 null饭豹,這個表達式的類型是 Int? 鸵赖。
//相當于 if not null
b?.length
2、 ?: 操作符</br>
相當于 if null 執(zhí)行一個語句
val values = ……
// 如果 values["email"] 為null墨状,則執(zhí)行 throw IllegalStateException("Email is missing!")
// 反之執(zhí)行 values["email"]
val email = values["email"] ?: throw IllegalStateException("Email is missing!")
3卫漫、 !! 操作符</br>
當對象為null,則拋出空指針(NPE)異常:</br>
val l = b!!.length
4肾砂、 .. 操作符</br>
x .. y
//從x 到y(tǒng),并且包含x宏悦、y值镐确,是一個閉區(qū)間運算符
//相對的 until 則是半閉區(qū)間運算符,包含 x 不包含 y
5饼煞、 in 操作符</br>
in 表示包含在區(qū)間中源葫, !in 則不在區(qū)間中
if(i in 1..10){ //相當于 i >= 1 && i<= 10
}
for(i in 1 until 10)
相當于
for(i = 1,i < 10,i++)
6、 == 與 === 操作符</br>
== 判斷值是否相等砖瞧,</br>
=== 判斷引用是否相等
7息堂、 :: 操作符</br>
得到類的 class 對象,創(chuàng)建一個成員引用或者一個類引用 </br>
1块促、得到類的class
val c = MyClass::class
2荣堰、函數引用
//聲明一個函數
fun isOdd(value: Int) = value%2 != 0
//作為函數類型值傳遞給另外一個函數
val numbers = listOf(1,2,3)
println(numbers.filter(::isOdd))
//運行結果
[1,3]
如果我們需要使用類的成員函數或擴展函數,它需要是限定的竭翠,例如 String::toCharArray振坚。
整體理解就是對函數或者類的一個引用,在上下文中明確函數返回類型斋扰,也可以使用該操作符重載函數
8渡八、 @ 操作符</br>
- 引入一個注解
//聲明
annotation class Fancy
//用法
@Fancy class Foo {
@Fancy fun baz(@Fancy foo: Int): Int {
return (@Fancy 1)
}
}
- 引入或者引用一個循環(huán)標簽
標簽的格式為標識符后跟 @ 啃洋,例如:abc@、fooBar@
1屎鳍、跳出一個雙層循環(huán)
loop@ for (i in 1..100) {
for (j in 1..100) {
if (……) break@loop
}
}
相當于在 return宏娄、continue、break 關鍵詞之后加上 @label逮壁,則跳轉結束到 @label 處
return@a 1
//當要返一個回值的時候孵坚,解析器優(yōu)先選用標簽限制的 return,
//相當于 從標簽 @a 返回 1
- 限定 this 的類型
class A { // 隱式標簽 @A
inner class B { // 隱式標簽 @B
fun Int.foo() { // 隱式標簽 @foo
val a = this@A // A 的 this
val b = this@B // B 的 this
val c = this // foo() 的接收者貌踏,一個 Int
val c1 = this@foo // foo() 的接收者十饥,一個 Int
val funLit = lambda@ fun String.() {
val d = this // funLit 的接收者
}
val funLit2 = { s: String ->
// foo() 的接收者,因為它包含的 lambda 表達式
// 沒有任何接收者
val d1 = this
}
}
}
}
- 引用外部超類
class Bar : Foo() {
override fun f() { /* …… */ }
override val x: Int get() = 0
inner class Baz {
fun g() {
super@Bar.f() // 調用 Foo 實現(xiàn)的 f()
println(super@Bar.x) // 使用 Foo 實現(xiàn)的 x 的 getter
}
}
}
-> 操作符
- 分隔在函數類型中的參數類型與返回類型聲明
詳細具體可以參考
http://www.kotlincn.net/docs/reference/lambdas.html#%E5%87%BD%E6%95%B0%E7%B1%BB%E5%9E%8B
1祖乳、(A逗堵,B)-> C
表示 接收的類型分別是 參數類型A、參數類型B眷昆、返回值類型C 的值
- 分隔 when 表達式分支的條件與代碼體
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意這個塊
print("x is neither 1 nor 2")
}
}
參考</br>
http://www.kotlincn.net/docs/reference/idioms.html</br>
https://www.kotlincn.net/docs/reference/keyword-reference.html</br>
https://blog.csdn.net/dangnianmingyue_gg/article/details/75305504