首發(fā)于公眾號(hào): DSGtalk1989
1.基礎(chǔ)語(yǔ)法
-
方法描述
fun methodName(type1 : Type, type2 : Type2) : returnType{} fun methodName(type1 : Type, type2 : Type2) : Unit { type1 = type2 }
-
變長(zhǎng)參數(shù) vararg
fun methodName(vararg v : Int){ //此處v是個(gè)數(shù)組 for(nv in v){ print(v) } }
類(lèi)似于 java中的 ...
//主函數(shù) 數(shù)組類(lèi)型的 fun main(args : Array<String>){ }
-
lambda 匿名函數(shù)
fun main(args : Array<String>){ //(傳參類(lèi)型1, 傳參類(lèi)型2) -> 返回類(lèi)型 = { 具體參數(shù)1, 具體參數(shù)2 -> 返回參數(shù)} val plus : (Int, Int) -> Int = { x,y -> x+y} println(plus(1,2)) }
-
var 可變 val 不可變
有一個(gè)非常有意思的現(xiàn)象,kotlin自帶屬性判斷功能,即你不指定具體的數(shù)據(jù)類(lèi)型,kotlin可以幫你分析出你想要什么。比如說(shuō):
//i被判斷成Int var i = 123 //s被判斷成String val s = "123"
-
String 字符串中直接引入?yún)?shù)和方法
//$符號(hào)之后跟{}表示方法绎橘,跟參數(shù)名表示引用參數(shù) val s = "${a.replace("ss", "ww")}, and then it is $a"
想要直接的去使用字符
$
,我們一般也是借助$
去實(shí)現(xiàn)唠倦,因?yàn)?code>$沒(méi)有相應(yīng)的轉(zhuǎn)義符val s = "${`$`}, is this"
-
關(guān)于空
//這邊我們可以直接把String? 看成是一種類(lèi)型称鳞,解釋為可以為空的String類(lèi)型 //可能會(huì)有疑問(wèn)既然s已經(jīng)被val描述,是final類(lèi)型的了稠鼻,還會(huì)出現(xiàn)可能為空的String //因?yàn)殡m然你不能再對(duì)s賦值了冈止, 但是你依然可以改變非賦值的方式改變它,比如replace什么的等等 val s : String? = "23" //一旦s為空就報(bào)錯(cuò) val a = s!!.toInt() //一旦s為空候齿,可以繼續(xù)執(zhí)行不報(bào)錯(cuò)熙暴,并且此處的b為null var b = s?.toInt() //b為null之后,我們緊接著調(diào)用b的其他的方法慌盯,產(chǎn)生的也是null周霉,并且不會(huì)報(bào)錯(cuò),這就是強(qiáng)大的kotlin容錯(cuò)機(jī)制 var c = b.toString() //? 和 ?: 的判斷表示如果為空的話亚皂,那么就返回后面的內(nèi)容 //此處的有需要多說(shuō)一句俱箱,一旦為空的情況,那么后面想給什么就給什么灭必,無(wú)論字符串還是整型等等狞谱,kotlin均可以自動(dòng)識(shí)別乃摹,跟你前面想要的類(lèi)型沒(méi)有關(guān)系 var d = b?.toString() ?: "123" //此處需要注意,一旦是有可能出現(xiàn)為空的類(lèi)型跟衅,kotlin就會(huì)在適當(dāng)?shù)臅r(shí)候通知到你 var h = s?.toInt() var i = 1 //此時(shí)由于h很有可能為空孵睬,因此kotlin會(huì)提示你不允許直接使用*操作符,而是要使用times方法進(jìn)行与斤?操作 var j = h * j //即如下這樣肪康,times方法在kotlin中被用來(lái)做乘法的使用 var j = h?.times(j)
-
類(lèi)型檢測(cè)
kotlin 中使用 is 來(lái)代替使用 isinstanceOf
kotlin 中不存在Object類(lèi),通常這個(gè)方法可以傳入任何數(shù)據(jù)類(lèi)型撩穿,kotlin直接使用 Any
fun getLength(s : Any){ if(s is String){ println(s.length) } }
-
范圍
java中使用的是
for(int i = 0; i < n; i++)
kotlin中比較方便磷支,直接使用
for(i in 1..n)
..針對(duì)任何可以進(jìn)行比較的數(shù)據(jù)類(lèi)型,比如
for(c in '0'..'9')
食寡,正對(duì)整形有單獨(dú)優(yōu)化雾狈,一般使用比較多的就是整型,并且對(duì)順序有要求抵皱,只能從小到大for(i in 4..1)
不會(huì)進(jìn)到for循環(huán)來(lái)善榛,因?yàn)?無(wú)法走到1針對(duì)從高到低的情況,要使用到downTo
for(i in 4 downTo 1)
for(i in 1..4 step 2)
====for(int i = 1; i <= 4; i = i + 2)
最終出來(lái)的是1呻畸,3..和downTo都是包含邊界數(shù)字的閉集[]移盆,如[1,4],如果想要開(kāi)集伤为,需要使用到until描述符
for(i in 1 until 10)
====== [1, 10) 但是由于局限性咒循,until也只能用在從小到大的并且只能做右邊的開(kāi)集,能用until
绞愚,就盡量不去使用1..n-1
范圍既可以用在for循環(huán)中也能用在if條件判斷中
比如
if (i in 1..4)
1 <= i <= 4if(c in '0'..'9')
'0' <= c <= '9'補(bǔ)充(1) 范圍之外直接使用 !in
if(i !in 1..4)
即 i 不在 1~4之間
補(bǔ)充(2) 結(jié)合when來(lái)判斷叙甸,數(shù)組中是否存在某元素
when{ "a" in items -> {} "b" in items -> {} }
-
with
kotlin中我們可以借助with來(lái)進(jìn)行連續(xù)調(diào)用方法
class Turtle { fun penDown() fun penUp() fun turn(degrees: Double) fun forward(pixels: Double) } val myTurtle = Turtle() with(myTurtle) { // 畫(huà)一個(gè) 100 像素的正方形 penDown() for(i in 1..4) { forward(100.0) turn(90.0) } penUp() }
-
java7 try with resources
java7中的特性,只要是實(shí)現(xiàn)了closeable的在使用完成之后需要釋放資源的類(lèi)位衩,會(huì)在
try
代碼體執(zhí)行完成之后釋放掉資源裆蒸,在kotlin中我們一般使用use
方法,規(guī)定為只要實(shí)現(xiàn)了closeable
接口的都有這個(gè)方法糖驴,意思為use
了之后就會(huì)釋放自己的資源//java7 try(BufferedReader br = new BufferedReader(new FileReader(path))){ return br.readLine(); } //kotlin var bufferedReader = BufferedReader(FileReader("path")) bufferedReader.use { print(it.readLine()) }
-
注釋習(xí)慣使用[]而非@param @return
除非需要做特長(zhǎng)的單獨(dú)性說(shuō)明僚祷,一般我們直接使用
[]
/** * Returns the absolute value of the given [number]. */ fun abs(number: Int) = ……
-
能用val不用var,一般用最基本不可變集合
val
和var
不做過(guò)多解釋了贮缕,此處的不可變集合指的是Set``List``Map
久妆,優(yōu)先使用這些,而不是優(yōu)先使用HashSet``ArrayList``HashMap
-
條件語(yǔ)句優(yōu)先級(jí)
二元首選if跷睦,其次再用when
-
循環(huán)語(yǔ)句優(yōu)先級(jí)
優(yōu)先使用高階函數(shù),
filter``map
這種肋演,需要單獨(dú)處理的我們用for
抑诸,除非在鏈?zhǔn)街姓{(diào)用 -
能屬性不用函數(shù)
底層算法會(huì)優(yōu)先使用屬性烂琴,而不是函數(shù)。所以如果是沒(méi)有參數(shù)的方法蜕乡,可以直接用屬性替代奸绷。
-
強(qiáng)轉(zhuǎn)操作符 as
java中的強(qiáng)轉(zhuǎn)是在對(duì)象前加上括號(hào)類(lèi)型的方式,kotlin中是通過(guò)
as
進(jìn)行強(qiáng)轉(zhuǎn)的层玲。一般我們?yōu)榱吮苊獬霈F(xiàn)
castException
或者空指針的情況号醉,直接使用?as
來(lái)進(jìn)行強(qiáng)轉(zhuǎn)。
Kotlin學(xué)習(xí)筆記之 1 基礎(chǔ)語(yǔ)法
Kotlin學(xué)習(xí)筆記之 2 基本數(shù)據(jù)類(lèi)型
Kotlin學(xué)習(xí)筆記之 4 循環(huán)控制
Kotlin學(xué)習(xí)筆記之 5 類(lèi)和對(duì)象
Kotlin學(xué)習(xí)筆記之 8 擴(kuò)展
Kotlin學(xué)習(xí)筆記之 9 數(shù)據(jù)類(lèi)與密封類(lèi)
Kotlin學(xué)習(xí)筆記之 11 枚舉類(lèi)
Kotlin學(xué)習(xí)筆記之 12 對(duì)象表達(dá)式和對(duì)象聲明
Kotlin學(xué)習(xí)筆記之 13 基礎(chǔ)操作符run辛块、with畔派、let、also润绵、apply
Kotlin學(xué)習(xí)筆記之 14 包與導(dǎo)入
Kotlin學(xué)習(xí)筆記之 15 伴生對(duì)象
Kotlin學(xué)習(xí)筆記之 18 函數(shù)
Kotlin學(xué)習(xí)筆記之 19 高階函數(shù)與 lambda 表達(dá)式
Kotlin學(xué)習(xí)筆記之 20 內(nèi)聯(lián)函數(shù)
Kotlin學(xué)習(xí)筆記之 21 解構(gòu)聲明
Kotlin學(xué)習(xí)筆記之 27 類(lèi)型別名
Kotlin學(xué)習(xí)筆記之 28 協(xié)程基礎(chǔ)
Kotlin學(xué)習(xí)筆記之 29 上下文與調(diào)度器
Kotlin學(xué)習(xí)筆記之 30 協(xié)程取消與超時(shí)
Kotlin學(xué)習(xí)筆記之 31 協(xié)程掛起函數(shù)的組合