Kotlin系列一:基礎(chǔ)知識快速入門(Kotlin入門)

      網(wǎng)友投稿 874 2022-05-30

      一 概述

      Android 1.5系統(tǒng)中Google 引入了NDK功能,支持使用C和C++語言來進行一些本地化開發(fā)。

      17年官宣kotlin為安卓一級開發(fā)語言;所以對于安卓開發(fā)者,學(xué)習(xí)kotlin是必須的,這是java最好的第三方庫(富語法糖java)。

      kotlin將代碼編譯成同樣規(guī)格的class文件讓Java虛擬機識別,它繼承了Java的全部財富,和Java100%兼容的,可以直接調(diào)用使用Java編寫的代碼,也可以無縫使用Java第三方的開源庫;Kotlin的類型推斷也在Java 8 中被推出,Lambda作為函數(shù)式編程的基礎(chǔ)也在Java 8版本中加入,兩者會越來越像。

      Kotlin是函數(shù)式編程語言(注1:),Kotlin的語法非常像Scala,python,借鑒了很多語言,學(xué)了很多語言發(fā)現(xiàn)他們越來越像,就像C#之父Anders Hejlsberg說的:未來的編程語言將逐漸融合各自的特性,而不會只存在單純的聲明式語言或者函數(shù)編程語言。

      對比Java的一些優(yōu)勢:

      與作為命令式語言時代的產(chǎn)物:Java相比,Kotlin對內(nèi)聯(lián)函數(shù)的支持,使它運行Lambda表達式更快;

      提前到編譯期的空指針安全檢測;

      Kotlin有很多現(xiàn)代靜態(tài)編程語言的特點:類型推斷、多范式支持、可空性表達、擴展函數(shù)、DSL支持等。這些功能Java也陸續(xù)在加入。(2021.5.5注:該句有歧義,Koltlin本身就是靜態(tài)語言,不要誤以為其為動態(tài)語言)

      二 基本類型

      Kotlin完全拋棄了Java中的基本數(shù)據(jù)類型,全部使用了對象數(shù)據(jù)類型,在 Kotlin 中,所有東西都是對象;

      2.1 數(shù)字

      基本Kotlin數(shù)值類型包括:Byte、Short、Int、Long、Float、Double等。與Java不同的是,Kotlin中的Charactor不屬于數(shù)值類型。

      Kotlin 提供了一組表示數(shù)字的內(nèi)置類型。 對于整數(shù),有四種不同大小的類型,因此值的范圍也不同。

      所有以未超出 Int 最大值的整型值初始化的變量都會推斷為 Int 類型。如果初始值超過了其最大值,那么推斷為 Long 類型。 如需顯式指定 Long 型值,請在該值后追加 L 后綴。

      val one = 1 // Int val threeBillion = 3000000000 // Long val oneLong = 1L // Long val oneByte: Byte = 1

      對于浮點數(shù),Kotlin 提供了 Float 與 Double 類型。

      對于以小數(shù)初始化的變量,編譯器會推斷為 Double 類型。 如需將一個值顯式指定為 Float 類型,請?zhí)砑?f 或 F 后綴。 如果這樣的值包含多于 6~7 位十進制數(shù),那么會將其舍入。

      val pi = 3.14 // Double val e = 2.7182818284 // Double val eFloat = 2.7182818284f // Float,實際值為 2.7182817

      請注意,與一些其他語言不同,Kotlin 中的數(shù)字沒有隱式拓寬轉(zhuǎn)換。 例如,具有 Double 參數(shù)的函數(shù)只能對 Double 值調(diào)用,而不能對 Float、 Int 或者其他數(shù)字值調(diào)用。

      注:=== 表示比較對象地址,== 表示比較兩個值大小。

      2.2 字符類型

      Kotlin中字符類型用Charactor表示,與Java不同的是,它們不能直接當(dāng)作數(shù)字,它無法直接使用Char類型的ASCII進行算數(shù)運算。如果需要用,得用toInt函數(shù)轉(zhuǎn)為相應(yīng)ASCII。

      2.3 布爾型

      一些語言比如OC或python中,false、true可以用0、1代替,在Kotlin/Java中不允許。

      2.4 數(shù)組類型

      Kotlin中數(shù)組用Array類表示,可以使用庫函數(shù) arrayOf() 來創(chuàng)建一個數(shù)組并傳遞元素值給它。Kotlin 也有無裝箱開銷的專門的類來表示原生類型數(shù)組: ByteArray、 ShortArray、IntArray 等等。這些類與 Array 并沒有繼承關(guān)系,但是它們有同樣的方法屬性集。

      // 大小為 5、值為 [0, 0, 0, 0, 0] 的整型數(shù)組 val arr = IntArray(5) // 例如:用常量初始化數(shù)組中的值 // 大小為 5、值為 [42, 42, 42, 42, 42] 的整型數(shù)組 val arr = IntArray(5) { 42 } // 例如:使用 lambda 表達式初始化數(shù)組中的值 // 大小為 5、值為 [0, 1, 2, 3, 4] 的整型數(shù)組(值初始化為其索引值) var arr = IntArray(5) { it * 1 }

      2.5 字符串

      Kotlin中字符串同Java,用String表示。

      字符串用 String 類型表示。字符串是不可變的。 字符串的元素——字符可以使用索引運算符訪問: s[i]。 可以用 for 循環(huán)迭代字符串。

      Kotlin提供了字符串的內(nèi)嵌表達式,也被稱為字符串模板。語法規(guī)則:

      "hello, ${obj.name}. nice to meet you!"

      字符串里嵌入${}這種語法結(jié)構(gòu)的表達式,并在運行時使用表達式執(zhí)行的結(jié)果替代這一部分內(nèi)容,當(dāng)表達式中僅有一個變量的時候,還可以將兩邊的大括號省略:

      "hello, $name. nice to meet you!"

      三 類型轉(zhuǎn)換和變量定義

      3.1 類型轉(zhuǎn)換

      精度缺失的問題就不多說了,一般兩個不同類型數(shù)字在邏輯運算時并不需要特別注意,算術(shù)運算符會重載適應(yīng)不同類型:

      val a = 1L + 3 // Long + Int => Long

      顯示轉(zhuǎn)換:

      3.2 變量

      Kotlin中定義一個變量,只允許在變量前聲明兩種關(guān)鍵字:val和var。

      val(value的簡寫)用來聲明一個不可變的變量,這種變量在初始賦值之后就再也不能重新賦值,對應(yīng)Java中的final變量。

      var(variable的簡寫)用來聲明一個可變的變量,這種變量在初始賦值之后仍然可以再被重新賦值,對應(yīng)Java中的非final變量。

      這樣設(shè)計,是為了解決Java中final關(guān)鍵字沒有被合理使用的問題。

      使用指導(dǎo):永遠優(yōu)先使用val來聲明一個變量,而當(dāng)val沒有辦法滿足你的需求時再使用var。

      Kotlin的類型推導(dǎo)機制:如下,val關(guān)鍵字定義了一個變量a賦值為10,這里a就會被自動推導(dǎo)成整型變量。

      fun main() { val a = 10 println("a = " + a) }

      但對一個變量延遲賦值的話,Kotlin就無法自動推導(dǎo)它的類型了。這時候就需要顯式地聲明變量類型才行:

      val a: Int = 10

      四 函數(shù)

      Kotlin函數(shù)語法規(guī)則:

      fun methodName(param1: Int, param2: Int): Int { return 0 }

      參數(shù)括號后面的部分用于聲明該函數(shù)會返回什么類型的數(shù)據(jù),上例表示該函數(shù)會返回一個Int類型的數(shù)據(jù)。

      如果一個函數(shù)不返回任何有用的值,它的返回類型是 Unit。如果函數(shù)不需要返回任何數(shù)據(jù),這部分可以不寫。

      當(dāng)一個函數(shù)中只有一行代碼時,Kotlin允許我們不必編寫函數(shù)體,可以直接將唯一的一行代碼寫在函數(shù)定義的尾部,中間用等號連接即可:

      fun largerNumber(num1: Int, num2: Int): Int = max(num1, num2)

      再結(jié)合Kotlin出色的類型推導(dǎo)機制,由于max()函數(shù)返回的是一個Int值,因此Kotlin可以推導(dǎo)出largerNumber()函數(shù)返回的必然也是一個Int值,代碼可以進一步簡化成如下形式:

      fun largerNumber(num1: Int, num2: Int) = max(num1, num2)

      默認參數(shù):

      函數(shù)參數(shù)可以有默認值,當(dāng)省略相應(yīng)的參數(shù)時使用默認值。與其他語言相比,這可以減少重載數(shù)量:

      fun read(b: Array, off: Int = 0, len: Int = b.size) { /*……*/ }

      如果在默認參數(shù)之后的最后一個參數(shù)是 lambda表達式,那么它既可以作為具名參數(shù)在括號內(nèi)傳入,也可以在括號外傳入:

      fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) { /*……*/ } foo(1) { println("hello") } // 使用默認值 baz = 1 foo(qux = { println("hello") }) // 使用兩個默認值 bar = 0 與 baz = 1 foo { println("hello") } // 使用兩個默認值 bar = 0 與 baz = 1

      Kotlin系列一:基礎(chǔ)知識快速入門(Kotlin入門)

      Kotlin函數(shù)的可見性修飾符和Java相比變化較大。

      Java和Kotlin中函數(shù)可見性修飾符之間的區(qū)別:

      五 控制流:if、when、for、while

      5.1 if條件語句

      fun largerNumber(num1: Int, num2: Int): Int { var value = 0 if (num1 > num2) { value = num1 } else { value = num2 } return value }

      Kotlin中的if語句相比于Java有一個額外的功能,它是可以有返回值的,返回值就是if語句每一個條件中最后一行代碼的返回值。因此,上述代碼就可以簡化成如下形式:

      fun largerNumber(num1: Int, num2: Int): Int { return if (num1 > num2) { num1 } else { num2 } }

      kotlin的語法糖里,當(dāng)一個函數(shù)只有一行代碼時,可以省略函數(shù)體部分,直接將這一行代碼使用等號串連在函數(shù)定義的尾部。雖然上述代碼中的largerNumber()函數(shù)不止只有一行代碼,但是它和只有一行代碼的作用是相同的,只是返回了一下if語句的返回值而已,符合該語法糖的使用條件。那么我們就可以將代碼進一步精簡:

      fun largerNumber(num1: Int, num2: Int) = if (num1 > num2) { num1 } else { num2 }

      再精練:

      fun largerNumber(num1: Int, num2: Int) = if (num1 > num2) num1 else num2

      5.2 when條件語句

      Kotlin中的when語句類似于Java中的switch語句,但比Java中的switch語句要靈活很多。Java中的switch只能傳入整型或短于整型的變量作為條件,JDK 1.7之后增加了對字符串變量的支持。

      編寫一個查詢考試成績的功能,輸入一個學(xué)生的姓名,返回該學(xué)生考試的分?jǐn)?shù),if寫法:

      fun getScore(name: String) = if (name == "Tom") { 86 } else if (name == "Jim") { 77 } else if (name == "Jack") { 95 } else if (name == "Lily") { 100 } else { 0 }

      when語句允許傳入一個任意類型的參數(shù),然后可以在when的結(jié)構(gòu)體中定義一系列的條件,格式是:

      匹配值 -> { 執(zhí)行邏輯 }

      當(dāng)你的執(zhí)行邏輯只有一行代碼時,{ }可以省略。

      當(dāng)使用when語句的時候,現(xiàn)在我們將代碼改成如下寫法:

      fun getScore(name: String) = when (name) { "Tom" -> 86 "Jim" -> 77 "Jack" -> 95 "Lily" -> 100 else -> 0 }

      除了精確匹配之外,when語句還允許進行類型匹配。舉個例子。定義一個checkNumber()函數(shù),如下所示:

      fun checkNumber(num: Number) { when (num) { is Int -> println("number is Int") is Double -> println("number is Double") else -> println("number not support") } }

      上述代碼中,is關(guān)鍵字就是類型匹配的核心,它相當(dāng)于Java中的instanceof關(guān)鍵字。

      由于checkNumber()函數(shù)接收一個Number類型的參數(shù),這是Kotlin內(nèi)置的一個抽象類,像Int、Long、Float、Double等與數(shù)字相關(guān)的類都是它的子類,所以就里就可以使用類型匹配來判斷傳入的參數(shù)到底屬于什么類型,如果是Int型或Double型,就將該類型打印出來,否則就打印不支持該參數(shù)的類型。

      when語句還有一種不帶參數(shù)的用法,雖然這種用法可能不太常用,但有的時候卻能發(fā)揮很強的擴展性。

      拿剛才的getScore()函數(shù)舉例,如果我們不在when語句中傳入?yún)?shù)的話,還可以這么寫:

      fun getScore(name: String) = when { name == "Tom" -> 86 name == "Jim" -> 77 name == "Jack" -> 95 name == "Lily" -> 100 else -> 0 }

      可以看到,這種用法是將判斷的表達式完整地寫在when的結(jié)構(gòu)體當(dāng)中。注意,Kotlin中判斷字符串或?qū)ο笫欠裣嗟瓤梢灾苯邮褂?=關(guān)鍵字,而不用像Java那樣調(diào)用equals()方法。可能你會覺得這種無參數(shù)的when語句寫起來比較冗余,但有些場景必須使用這種寫法才能實現(xiàn)。舉個例子,假設(shè)所有名字以Tom開頭的人,他的分?jǐn)?shù)都是86分,這種場景如果用帶參數(shù)的when語句來寫就無法實現(xiàn),而使用不帶參數(shù)的when語句就可以這樣寫:

      fun getScore(name: String) = when { name.startsWith("Tom") -> 86 name == "Jim" -> 77 name == "Jack" -> 95 name == "Lily" -> 100 else -> 0 }

      現(xiàn)在不管你傳入的名字是Tom還是Tommy,只要是以Tom開頭的名字,他的分?jǐn)?shù)就是86分。

      5.3 For循環(huán)

      Java中主要有兩種循環(huán)語句:while循環(huán)和for循環(huán)。Kotlin的while循環(huán)和Java中的while循環(huán)沒有任何區(qū)別。

      Kotlin在for循環(huán)方面做了很大幅度的修改,Java中最常用的for-i循環(huán)在Kotlin中直接被舍棄了,而Java中另一種for-each循環(huán)則被Kotlin進行了大幅度的加強,變成了for-in循環(huán),所以我們只需要學(xué)習(xí)for-in循環(huán)的用法就可以了。

      區(qū)間的概念

      閉區(qū)間:[0, 10]

      val range = 0..10

      左閉右開區(qū)間:[0,10):

      val range = 0 until 10

      有了區(qū)間之后,我們就可以通過for-in循環(huán)來遍歷這個區(qū)間,比如在main()函數(shù)中編寫如下代碼:

      fun main() { for (i in 0..10) { println(i) } }

      默認情況下,for-in循環(huán)每次執(zhí)行循環(huán)時會在區(qū)間范圍內(nèi)遞增1,相當(dāng)于Java for-i循環(huán)中i++的效果,而如果你想跳過其中的一些元素,可以使用step關(guān)鍵字:

      fun main() { for (i in 0 until 10 step 2) { println(i) } }

      上述代碼表示在遍歷[0, 10)這個區(qū)間的時候,每次執(zhí)行循環(huán)都會在區(qū)間范圍內(nèi)遞增2,相當(dāng)于for-i循環(huán)中i = i + 2的效果。

      … 和until關(guān)鍵字都要求區(qū)間的左端必須小于等于區(qū)間的右端,也就是這兩種關(guān)鍵字創(chuàng)建的都是一個升序的區(qū)間。如果你想創(chuàng)建一個降序的區(qū)間,可以使用downTo關(guān)鍵字,用法如下:

      fun main() { for (i in 10 downTo 1) { println(i) } }

      這里我們創(chuàng)建了一個[10, 1]的降序區(qū)間。

      標(biāo)注1:

      函數(shù)式編程是一種編程范式,我們常見的編程范式有命令式編程(Imperative programming),函數(shù)式編程,邏輯式編程,常見的面向?qū)ο缶幊淌且彩且环N命令式編程。更多了解推薦參考:https://www.zhihu.com/question/28292740

      學(xué)習(xí)參考

      1 官網(wǎng)文檔 https://www.kotlincn.net/docs/reference/basic-syntax.html

      2 郭霖:《第一行代碼》

      Java Kotlin

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:CentOS部署Python Django項目生產(chǎn)環(huán)境(centos部署python項目)
      下一篇:基于 OData 協(xié)議的 API 開發(fā)指南(基于是什么意思)
      相關(guān)文章
      91亚洲国产成人久久精品网站| 国产亚洲人成网站观看| 亚洲天堂视频在线观看| 亚洲精品无码久久久| 亚洲hairy多毛pics大全| 亚洲人成在线中文字幕| 亚洲视频一区在线观看| 亚洲无线电影官网| 亚洲AV成人精品网站在线播放 | 自拍偷自拍亚洲精品情侣| 亚洲av成人一区二区三区在线播放| 亚洲色精品VR一区区三区| 亚洲AV无码一区二区三区人| 亚洲一区二区免费视频| 久久精品国产亚洲av麻豆图片 | 亚洲精品视频免费观看| 亚洲国产一区二区视频网站| 亚洲国产精品成人AV无码久久综合影院| 亚洲av无码一区二区三区天堂 | 亚洲AV日韩AV无码污污网站| 亚洲av乱码中文一区二区三区| 亚洲av无码一区二区三区四区 | 久久精品国产亚洲AV天海翼| 国产精品亚洲精品爽爽| 一区二区三区亚洲视频| 亚洲成AV人在线观看网址| 亚洲精品天堂成人片?V在线播放| 亚洲国产电影av在线网址| 亚洲国产成人精品女人久久久 | 久久精品国产99国产精品亚洲| 亚洲国产日韩精品| 亚洲熟女乱色一区二区三区| 亚洲hairy多毛pics大全| 国内成人精品亚洲日本语音| 亚洲精品无码久久久| 亚洲精品成人片在线观看精品字幕| 国产成人亚洲综合无码精品| 亚洲精品无码不卡| 亚洲国产av一区二区三区丶| 亚洲а∨天堂久久精品9966| 亚洲av中文无码字幕色不卡|