Kotlin語法梳理(一)

目錄

宣告變數
宣告變數使用 var 、 val 關鍵字,如下:
var | val 變數名 [:型別] [= 初始值]
var n : Int = 0 var s : String = "變數的定義" // var宣告的是變數,val宣告的是常量
和 Java 的不同之處是,變數型別寫在變數名後面了,和 go 語言類似。 在Kotlin中每條語句的最後不用加分號。
資料型別
與Java基本型別相對應, Kotlin 也有8中基本資料型別:
- 整數型別 :Byte、Short、Int和Long,Int是預設型別。
- 浮點型別 :Float和Double,Double是預設型別。
- 字元型別 :Char。
- 布林型別 :Boolean。
Kotlin的8個基本資料型別沒有對應的 包裝類 , Kotlin 編譯器會根據不同的場景將其編譯成為Java中的基本型別資料還是包裝類物件。例如, Kotlin 的 Int 用來宣告變數、常量、屬性、函式引數型別和函式返回型別等情況時,被編譯為Java的 int 型別;當作為集合泛型類似引數時,則被編譯為Java的 java.lang.Integer ,這是因為Java集合中只能儲存物件
資料型別之間的轉換
Kotlin中要想實現這種賦值轉換,需要使用轉換函式 顯式轉換 。Kotlin中不能像Java中那樣的自動型別轉換,必須顯示轉換;Kotlin的6種數值型別(Byte、Short、Int、Long、Float和Double),以及Char型別都有如下7個轉換函式: toByte(), toShort(): , toInt(),toLong(),toFloat(), toDouble(), toChar() 通過上述7個轉換函式可以實現7種類型(Byte、Short、Int、Long、Float、Double和Char)之間的任意轉換。
var n1 :Int = 10 //或者 var n1 = 10,整數預設為Int var n2 :Double = n1.toDouble() //必須顯示轉換
非空安全
Kotlin預設是非空的,在非空型別後面加上問號 “?” 表示可空型別。
var str : String = null //錯誤的程式碼,預設非空 var str : String? = null //標識可空
可空型別在具體使用時會有一些 限制 : 不能直接呼叫可空型別物件的函式或屬性。 不能把可空型別資料賦值給非空型別變數。 不能把可空型別資料傳遞給非空型別引數的函式。
var str : String? = null ........ str.length //錯誤程式碼,可空型別不能直接呼叫可空型別物件的函式或屬性
為了“突破”這些限制, Kotlin 提供瞭如下運算子: 安全呼叫運算子:?. Elvis運算子:?: 非空斷言:!!
可空型別變數使用 安全呼叫運算子?. 可以呼叫非空型別的函式或屬性。 安全呼叫運算子?. 會判斷可空型別變數是否為空,如果是則不會呼叫函式或屬性,直接返回空值;否則返回呼叫結果。
var str : String ? = null var length = str!!.length //非空斷言,一旦str為空,丟擲空指標異常
var str : String? = null var length =str?.length //如果str不為空直接呼叫,如果為空直接返回null,而不會丟擲空指標異常 如果為空時不想返回null,通過?:可以執行為空時的返回值 var length =str?.length?:0 //str為空時返回0A ?: B,如果A不為空值則結果為A,否則為B
常量
在 Kotlin 宣告常量是在識別符號的前面加上 val 或 const val 關鍵字,它們的區別如下:
- val 宣告的是執行期常量,常量是在執行時初始化的。
- const val 宣告的是編譯期常量,常量是在編譯時初始化,只能用於頂層常量宣告或宣告物件中的常量宣告,而且只能是String或基本資料型別(整數、浮點等)。
給Java程式員的提示編譯期常量(const val)相當於Java中public final static所修飾的常量。而執行期常量(val)相當於Java中final所修飾的常量。
運算子
Kotlin的 ==運算子 和 equals函式 等同於Java的equals函式。 Kotlin 中的 === 運算子等同於Java的==運算子。
定義方法
fun [方法名] ( [引數名] : [引數型別] ) : [返回型別]{
...
return [返回值]
}
fun add(m:Int, n:Int):Int { return m + n } //也可以寫成表示式的方式: fun add(m : Int, n : Int) : Int = m + n
流程控制語句
Kotlin中 流程控制語句 的結果可以直接賦值給一個變數
//java傳統寫法 if (a > b) { max = a } else { max = b } // kotlin寫法 val max = if (a > b) a else b
when語句
when 取代了類 java中的 switch 操作符。其最簡單的形式如下:
when (i) { 1 -> { //操作。。。。 } 2 -> { //操作。。。。 } else -> { //操作。。。。 } }
此外,還可以 使用in或者!in表示式 結果是否在一個範圍或集合中;可以用 is或者!is表示式 結果是否是某一型別的物件
when (x) { in 1..10 -> print("x is in the range") in validNumbers -> print("x is valid") //validNumbers 為一個集合 !in 10..20 -> print("x is outside the range") else -> print("none of the above") }
when (view) { is TextView -> toast(view.text) is RecyclerView -> toast("Item count = ${view.adapter.itemCount}") is SearchView -> toast("Current query: ${view.query}") else -> toast("View type not supported") }
when語句還可以省略表示式,此時分支條件表示式預設為Boolean型,在分支為true時會執行分支
when { a is String -> print("傳入的值是String型別") a is Int -> print("傳入的值是Int型別") a is Long -> print("傳入的值是Long型別") a is ExampleUnitTest -> print("傳入的值是ExampleUnitTest型別") }
for迴圈
for (item in stringArrays){ println(item) }
在 for語句 遍歷集合時,一般不需要迴圈變數,但是如果需要使用迴圈變數,可以使用 集合indices屬性
for (i in stringArrays.indices) { println(stringArrays[i]) //i為索引 }
還可以指定一個範圍
for (i in 0..10 step 1) { // step 1 指定步長(i每次加幾)可以省略,預設為1 println(stringArrays[i]) }
forEach 使用
stringArrays.forEach {//stringArrays為一個集合 println(it); }
還可以在遍歷的時候獲取索引
mlist.forEachIndexed { index, value ->//index為索引,value為索引對應的值 println("第${index}個值為:$value") }
return,break和continue
Kotlin 和java一樣,有三種結構化跳轉表示式:
return:從包圍它的函式或匿名函式返回
break: 終止迴圈
continue: 跳出本次迴圈,繼續下一次迴圈
和Java不同的是,這些表示式都可作為更大表達式的一部分:
val s = person.name ?: return
break和 continue 語句都有兩種方式: 帶有標籤和不帶標籤
loop@ for (i in 1..100) {//" loop@ "定義的標籤格式為:名字@ for (j in 1..100) { if (……) break@loop // 終止loop標記的迴圈 if (……) continue@loop // 跳出loop標記的迴圈,繼續下一次loop標記的迴圈 } }
**return ** 也支援 @標籤標籤,只是標籤定義的地方不同
mList.forEach lit@ { if (it == 0) return@lit // 標記從forEach{}返回 print(it) } //用隱式標籤(與接收lambda的函式同名)從lambda表示式中返回: mList.forEach { if (it == 0) return@forEach // 隱式標籤forEach,從forEach{}返回 print(it) }
需要注意的是:當return返回值時,表示的含義是不一樣的
return@a 1 // 從@a標記的函式返回1,不是返回標記的表示式(@a 1)”。
不帶標籤的用法與Java中的一樣。
總結
上述只是一些簡單的語法,跟java中的用法差不多,只是功能更強大一些,使用起來確實很方便;重點是在類相關語法那塊與Java中有很大的不同,內容也比較多。下一篇主要來梳理類相關的語法以及注意點。
關注微信公眾號獲取Kotlin視訊和書籍資料

Android行動派