首發于公眾號: DSGtalk1989
1.基礎語法
-
方法描述
fun methodName(type1 : Type, type2 : Type2) : returnType{} fun methodName(type1 : Type, type2 : Type2) : Unit { type1 = type2 }
-
變長參數 vararg
fun methodName(vararg v : Int){ //此處v是個數組 for(nv in v){ print(v) } }
類似于 java中的 ...
//主函數 數組類型的 fun main(args : Array<String>){ }
-
lambda 匿名函數
fun main(args : Array<String>){ //(傳參類型1, 傳參類型2) -> 返回類型 = { 具體參數1, 具體參數2 -> 返回參數} val plus : (Int, Int) -> Int = { x,y -> x+y} println(plus(1,2)) }
-
var 可變 val 不可變
有一個非常有意思的現象,kotlin自帶屬性判斷功能,即你不指定具體的數據類型,kotlin可以幫你分析出你想要什么。比如說:
//i被判斷成Int var i = 123 //s被判斷成String val s = "123"
-
String 字符串中直接引入參數和方法
//$符號之后跟{}表示方法,跟參數名表示引用參數 val s = "${a.replace("ss", "ww")}, and then it is $a"
想要直接的去使用字符
$
,我們一般也是借助$
去實現,因為$
沒有相應的轉義符val s = "${`$`}, is this"
-
關于空
//這邊我們可以直接把String? 看成是一種類型,解釋為可以為空的String類型 //可能會有疑問既然s已經被val描述,是final類型的了,還會出現可能為空的String //因為雖然你不能再對s賦值了, 但是你依然可以改變非賦值的方式改變它,比如replace什么的等等 val s : String? = "23" //一旦s為空就報錯 val a = s!!.toInt() //一旦s為空,可以繼續執行不報錯,并且此處的b為null var b = s?.toInt() //b為null之后,我們緊接著調用b的其他的方法,產生的也是null,并且不會報錯,這就是強大的kotlin容錯機制 var c = b.toString() //? 和 ?: 的判斷表示如果為空的話,那么就返回后面的內容 //此處的有需要多說一句,一旦為空的情況,那么后面想給什么就給什么,無論字符串還是整型等等,kotlin均可以自動識別,跟你前面想要的類型沒有關系 var d = b?.toString() ?: "123" //此處需要注意,一旦是有可能出現為空的類型,kotlin就會在適當的時候通知到你 var h = s?.toInt() var i = 1 //此時由于h很有可能為空,因此kotlin會提示你不允許直接使用*操作符,而是要使用times方法進行?操作 var j = h * j //即如下這樣,times方法在kotlin中被用來做乘法的使用 var j = h?.times(j)
-
類型檢測
kotlin 中使用 is 來代替使用 isinstanceOf
kotlin 中不存在Object類,通常這個方法可以傳入任何數據類型,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)
..針對任何可以進行比較的數據類型,比如
for(c in '0'..'9')
,正對整形有單獨優化,一般使用比較多的就是整型,并且對順序有要求,只能從小到大for(i in 4..1)
不會進到for循環來,因為4無法走到1針對從高到低的情況,要使用到downTo
for(i in 4 downTo 1)
for(i in 1..4 step 2)
====for(int i = 1; i <= 4; i = i + 2)
最終出來的是1,3..和downTo都是包含邊界數字的閉集[],如[1,4],如果想要開集,需要使用到until描述符
for(i in 1 until 10)
====== [1, 10) 但是由于局限性,until也只能用在從小到大的并且只能做右邊的開集,能用until
,就盡量不去使用1..n-1
范圍既可以用在for循環中也能用在if條件判斷中
比如
if (i in 1..4)
1 <= i <= 4if(c in '0'..'9')
'0' <= c <= '9'補充(1) 范圍之外直接使用 !in
if(i !in 1..4)
即 i 不在 1~4之間
補充(2) 結合when來判斷,數組中是否存在某元素
when{ "a" in items -> {} "b" in items -> {} }
-
with
kotlin中我們可以借助with來進行連續調用方法
class Turtle { fun penDown() fun penUp() fun turn(degrees: Double) fun forward(pixels: Double) } val myTurtle = Turtle() with(myTurtle) { // 畫一個 100 像素的正方形 penDown() for(i in 1..4) { forward(100.0) turn(90.0) } penUp() }
-
java7 try with resources
java7中的特性,只要是實現了closeable的在使用完成之后需要釋放資源的類,會在
try
代碼體執行完成之后釋放掉資源,在kotlin中我們一般使用use
方法,規定為只要實現了closeable
接口的都有這個方法,意思為use
了之后就會釋放自己的資源//java7 try(BufferedReader br = new BufferedReader(new FileReader(path))){ return br.readLine(); } //kotlin var bufferedReader = BufferedReader(FileReader("path")) bufferedReader.use { print(it.readLine()) }
-
注釋習慣使用[]而非@param @return
除非需要做特長的單獨性說明,一般我們直接使用
[]
/** * Returns the absolute value of the given [number]. */ fun abs(number: Int) = ……
-
能用val不用var,一般用最基本不可變集合
val
和var
不做過多解釋了,此處的不可變集合指的是Set``List``Map
,優先使用這些,而不是優先使用HashSet``ArrayList``HashMap
-
條件語句優先級
二元首選if,其次再用when
-
循環語句優先級
優先使用高階函數,
filter``map
這種,需要單獨處理的我們用for
,除非在鏈式中調用 -
能屬性不用函數
底層算法會優先使用屬性,而不是函數。所以如果是沒有參數的方法,可以直接用屬性替代。
-
強轉操作符 as
java中的強轉是在對象前加上括號類型的方式,kotlin中是通過
as
進行強轉的。一般我們為了避免出現
castException
或者空指針的情況,直接使用?as
來進行強轉。
Kotlin學習筆記之 13 基礎操作符run、with、let、also、apply