Kotlin學(xué)習(xí)(一):我TM謝謝你恨狈!(基礎(chǔ)語法篇)
前言
自從2017年Google定義Kotlin為Android開發(fā)的官方語言疏哗,瞬間掀起了學(xué)習(xí)大潮,各種學(xué)習(xí)博客如雨后春筍般攻擊我這顆弱小而又無助的小心臟拴事!是你們沃斤,是的,就是因為你們使我變得越來越強大刃宵,我TM替我日益稀疏的頭發(fā)謝謝各位學(xué)霸:馄俊!牲证!所以哮针,搞起來吧!開啟我們從烏黑亮麗到寸草不生的kotlin學(xué)習(xí)之旅!
我的博客(Power)
作為Android開發(fā)水軍中的一員十厢,其實很早就簡單看了語法等太,其中的優(yōu)缺點這里就不再過多陳述,不清楚或想詳細(xì)了解的請自行社會你度十三娘蛮放,鑒于大家如果能有幸看見這邊文章缩抡,想必對我們吃飯的家伙熟悉程度應(yīng)該不亞于我了,所以對于Android studio的環(huán)境配置這里小弟就不再賣弄風(fēng)騷了包颁,畢竟在座的各位都是學(xué)霸瞻想,VIP中P...
這里在開頭也為大家分享一些大牛關(guān)于學(xué)習(xí)Kotlin的鏈接,有助于大家在吃百家飯的時候,不容易養(yǎng)成挑食的小毛病。
本系列均踩在各位巨人的肩膀上總結(jié)而成纵搁!請各位看官輕噴...
Kotlin語言中國
Kotlin-菜鳥教程
Kotlin入門到進(jìn)階
玩Android-kotlin文章
Kotlin基礎(chǔ)語法
-
函數(shù)的定義
函數(shù)使用關(guān)鍵字 fun,參數(shù)格式為:參數(shù) : 類型// sum:函數(shù)名 a,b參數(shù)名佃迄,Int參數(shù)類型 fun sum(a: Int, b: Int): Int {// :后邊Int為返回值類型 return a + b }
- 這里需要注意如果是public則必須聲明返回值類型,如果是無返回值的函數(shù)(:Unit)則可以省略贵少。
fun unitFun() : Unit{ println("我是返回值為Unit的函數(shù)呵俏,Unit可省略") return // return Unit 可省略 // 或者 return 可省略 } //等價于 fun unitFun(){ println("我是返回值為Unit的函數(shù),Unit可省略") }
- 可變長參數(shù)函數(shù)春瞬,用 vararg 關(guān)鍵字進(jìn)行標(biāo)識
fun vars(vararg v:Int){ for(vt in v){ print(vt) } } // 測試 fun main(args: Array<String>) { vars(1,2,3,4,5) // 輸出12345 }
-
常量與變量
變量:var <標(biāo)識符> : <類型> = <初始化值>var x: Int = 5 // 系統(tǒng)自動推斷變量類型為Int x += 1 // 變量可修改
常量:val <標(biāo)識符> : <類型> = <初始化值>
val a: Int = 1 val b = 1 // 系統(tǒng)自動推斷變量類型為Int val c: Int // 如果不在聲明時初始化則必須提供變量類型 c = 1 // 明確賦值
Kotlin基本數(shù)據(jù)類型
基礎(chǔ)數(shù)據(jù)類型包含有:
- 數(shù)值類型
- 字符類型
- 字符串類型
- 布爾類型
- 數(shù)組類型
-
數(shù)值類型(Numbers)
Kotlin 的基本數(shù)值類型包括 Byte柴信、Short、Int宽气、Long随常、Float、Double 等
不同于 Java 的是萄涯,字符不屬于數(shù)值類型绪氛,是一個獨立的數(shù)據(jù)類型。類型 位寬度 Byte 8 Short 16 Int 32 Long 64 Float 32 Double 64 -
字符類型(Characters)
和 Java 不一樣涝影,Kotlin 中的 Char 不能直接和數(shù)字操作枣察,Char 必需是單引號 ' 包含起來的。比如普通字符 '0'燃逻,'a'val ch :Char = 1; // 錯誤示范 val ch :Char = '1'; // 正確示范 // 將字符類型轉(zhuǎn)換成數(shù)字 val ch :Char = '8'; val a :Int = ch.toInt()
-
字符串類型(Strings)
和 Java 一樣序目,String 是不可變的。//1.方括號 [] 語法可以很方便的獲取字符串中的某個字符伯襟,也可以通過 for 循環(huán)來遍歷: for (c in str) { println(c) } //2.支持三個引號 """ 擴起來的字符串猿涨,支持多行字符串,比如: fun main(args: Array<String>) { val text = """ 多行字符串 多行字符串 """ println(text) // 輸出有一些前置空格 } //3.String 可以通過 trimMargin() 方法來刪除多余的空白: fun main(args: Array<String>) { val text = """ |多行字符串 |菜鳥教程 |多行字符串 |Runoob """.trimMargin() println(text) // 前置空格刪除了 }
字符串模板:即在字符串內(nèi)通過一些小段代碼求值并把結(jié)果合并到字符串中姆怪。模板表達(dá)式以美元符($)開頭
fun main(args: Array<String>) { val i = 10 val s = "i = $i" println(s) // 求值結(jié)果為 "i = 10" } //用花括號擴起來的任意表達(dá)式: fun main(args: Array<String>) { val s = "runoob" val str = "$s.length is ${s.length}" println(str) // 求值結(jié)果為 "runoob.length is 6" }
-
布爾類型(Boolean)
布爾用 Boolean 類型表示叛赚,它有兩個值:true 和 false澡绩。
內(nèi)置的布爾運算有:|| – 短路邏輯或 && – 短路邏輯與 ! - 邏輯非
-
數(shù)組類型(Arrays)
數(shù)組用類 Array 實現(xiàn),并且還有一個 size 屬性及 get 和 set 方法俺附,由于使用 [] 重載了 get 和 set 方法肥卡,所以我們可以通過下標(biāo)很方便的獲取或者設(shè)置數(shù)組對應(yīng)位置的值。
數(shù)組的創(chuàng)建兩種方式:一種是使用函數(shù)arrayOf()事镣;另外一種是使用工廠函數(shù)步鉴。fun main(args: Array<String>) { //[1,2,3] val a = arrayOf(1, 2, 3) //[0,2,4] val b = Array(3, { i -> (i * 2) }) //讀取數(shù)組內(nèi)容 println(a[0]) // 輸出結(jié)果:1 println(b[1]) // 輸出結(jié)果:2 }
注意: 與 Java 不同的是,Kotlin 中數(shù)組是不型變的(invariant)
除了類Array璃哟,還有ByteArray, ShortArray, IntArray等等唠叛,用來表示各個類型的數(shù)組,省去了裝箱操作沮稚,因此效率更高,其用法同Array一樣:val x: IntArray = intArrayOf(1, 2, 3) x[0] = x[1] + x[2]
Kotlin的Null安全設(shè)計
-
聲明可為null參數(shù)及null判斷處理
類型后面加 册舞? 即表示可為null
進(jìn)行判null處理時有兩種方式:
第一種就是字段后加 !! 表示像java一樣拋出null異常
第二種就是字段后加 ? 表示不作處理蕴掏,可以返回null
第三種就是字段后加 ?: 表示字段為null時返回的值
當(dāng)然, if/else也是可以的调鲸,在使用if判null后盛杰,可自動轉(zhuǎn)換為非null變量//類型后面加?表示可為空 var age: String? = "23" //拋出空指針異常 val ages = age!!.toInt() //不做處理返回 null val ages1 = age?.toInt() //age為空返回-1 val ages2 = age?.toInt() ?: -1
-
函數(shù)中使用可null類型
當(dāng)一個函數(shù)/方法有返回值時,如果方法中的代碼使用?.去返回一個值藐石,那么方法的返回值的類型后面也要加上 ? 符號fun funNullMethod() : Int? { val str : String? = "123456" return str?.length } //輸出:6
Kotlin的類型檢測及自動類型轉(zhuǎn)換
-
我們可以使用 is 運算符檢測一個表達(dá)式是否某類型的一個實例(類似于Java中的instanceof關(guān)鍵字)
fun getStringLength(obj: Any): Int? { if (obj is String) { // 做過類型判斷以后即供,obj會被系統(tǒng)自動轉(zhuǎn)換為String類型 return obj.length } //在這里還有一種方法,與Java中instanceof不同于微,使用!is // if (obj !is String){ // // XXX // } // 這里的obj仍然是Any類型的引用 return null } //或者 fun getStringLength(obj: Any): Int? { if (obj !is String) return null // 在這個分支中, `obj` 的類型會被自動轉(zhuǎn)換為 `String` return obj.length } //甚至還可以 fun getStringLength(obj: Any): Int? { // 在 `&&` 運算符的右側(cè), `obj` 的類型會被自動轉(zhuǎn)換為 `String` if (obj is String && obj.length > 0) return obj.length return null }
Kotlin的區(qū)間表達(dá)式
區(qū)間表達(dá)式由具有操作符形式 .. 的 rangeTo 函數(shù)輔以 in 和 !in 形成逗嫡。
-
區(qū)間是為任何可比較類型定義的,但對于整型原生類型株依,它有一個優(yōu)化的實現(xiàn)驱证。以下是使用區(qū)間的一些示例:
for (i in 1..4) print(i) // 輸出“1234” for (i in 4..1) print(i) // 什么都不輸出 if (i in 1..10) { // 等同于 1 <= i && i <= 10 println(i) } // 使用 step 指定步長 for (i in 1..4 step 2) print(i) // 輸出“13” for (i in 4 downTo 1 step 2) print(i) // 輸出“42” // 使用 until 函數(shù)排除結(jié)束元素 for (i in 1 until 10) { // i in [1, 10) 排除了 10 println(i) } //實測示例 fun main(args: Array<String>) { print("循環(huán)輸出:") for (i in 1..4) print(i) // 輸出“1234” println("\n----------------") print("設(shè)置步長:") for (i in 1..4 step 2) print(i) // 輸出“13” println("\n----------------") print("使用 downTo:") for (i in 4 downTo 1 step 2) print(i) // 輸出“42” println("\n----------------") print("使用 until:") // 使用 until 函數(shù)排除結(jié)束元素 for (i in 1 until 4) { // i in [1, 4) 排除了 4 print(i) } println("\n----------------") } /* 輸出結(jié)果: 循環(huán)輸出:1234 ---------------- 設(shè)置步長:13 ---------------- 使用 downTo:42 ---------------- 使用 until:123 ---------------- */