都是常規操作

經過上文的介紹,想必你對 Kotlin 有了一定的興趣了吧,Kotlin 簡化了很多在 Java 裏需要寫大量代碼的操作,稍安勿躁,我們來看看都有哪些 “常規操作”。

集合

對於集合,想必你已經熟悉得不能再熟了,我就不廢話了,我們來看看在 Kotlin 裏怎麼使用集合吧。

上文中我們曾經提到過,在 Kotlin 中 使用 var val 來聲明 可變變量 只讀變量。類似的,在集合中也存在這樣的概念:

var list: List<String> = listOf("1", "2", "3", "4") //初始化一個只讀集合
val mutableList: MutableList<String> = mutableListOf("1", "2", "3", "4") //初始化一個可變集合
list.get(1)
mutableList.add("5")
println(list)
println(mutableList)

雖然我們使用了 var 來聲明瞭變量 list,但是由於聲明的是 List 類型,所以他是一個只讀的集合。雖然我們使用了 val 聲明瞭一個只讀變量 mutableList,但是我們仍然可以對他進行數據操作。

這裏我們需要明確 var val真正的作用意義,var無需多言,val 並不是向我們想象的聲明任意一個變量後這個變量就是不可變的了。此處的不可變在我理解只是引用的不可變,如果是基礎類型的話,就是其值不可變。

顯然對於集合而言,我們操作集合並不會修改這個集合的引用,只是修改這個集合所在內存中的內容而已,所以纔會出現我們上面代碼中的那種情況。

在 Kotlin 中聲明一個只讀集合,我們可以使用 Set List Map,聲明可變集合需要使用到 MutableSet MutableList MutableMap

Kotlin 並沒有專門的語法結構創建 list 或 set,要用標準庫的方法,如 listOf()、 mutableListOf()、 setOf()、 mutableSetOf()來創建。當然我們還可以直接引入 Java 的這些類:

var list = listOf("1","2","3") //初始化一個只讀集合
val mutableList = mutableListOf("1", "2", "3", "4") //初始化一個可變集合
var listJava = ArrayList<String>() //調用 Java 中的集合類
println(list[1])

Kotlin 還允許我們像數組那樣讀取 List 以及 Map :

var mutablemap = mutableMapOf("1" to "one","2" to "two")
mutablemap.put("4" ,"four") //Java 式新增
mutablemap["5"] = "FIVE"  // Kotlin 式新增
println(mutablemap.get("1")) //Java 式讀取
println(mutablemap["2"])    // Kotlin 式讀取

擴展函數以及其他高級特性

擴展函數應該是 Kotlin 中最迷人的部分了,Kotlin 同 C# 和 Gosu 類似,能夠擴展一個類的新功能而無需繼承該類或使用像裝飾者這樣的任何類型的設計模式。 這通過叫做 擴展 的特殊聲明完成。Kotlin 支持 擴展函數 和 擴展屬性。

直接看代碼吧:

fun MutableList<String>.changeIndex2():MutableList<String>{
    for (i in 0..this.size) {
        if (i % 2 ==0) {
            this[i]+="^"
        }
    }
    return this
}

在 fun 關鍵字後面的是我們要擴展的類, “.” 隔開的是我們的擴展函數名,跟普通的函數一樣,我們可以有傳入參數以及返回值。在擴展函數中 this 關鍵字可以得到調用擴展函數的實例。

我們在一段代碼中調用這個擴展函數看看結果是什麼樣的:

var mutableList = mutableListOf("1", "2", "3", "4") //初始化一個可變集合
mutableList.apply {
    add("5")
}
println(mutableList)
var newlist = mutableList.changeIndex2().filter {
    it.endsWith("^")
}
println(mutableList)
println(newlist)

---------------
[1, 2, 3, 4, 5]
[1^, 2, 3^, 4, 5^]
[1^, 3^, 5^]
---------------

這段代碼中我們展示了幾種 Kotlin 的高級使用,例如 apply
apply函數是這樣的,調用某對象的apply函數,在函數範圍內,可以任意調用該對象的任意方法,並返回該對象。

mutableList.changeIndex2() 這裏我們調用了前文中提到的擴展函數,這個擴展函數的返回值還是這個 MutableList,所以我們可以對其調用 filter 這個函數,這個函數接受一個 Lambda 表達式作爲參數,其傳入值是集合中的元素,返回值是 Boolean。

正常一個 Lambda 表達式的結構是這樣的 { i: Int -> i + 1 }-> 前面的是函數的傳入值,後面的是函數體。一個 lambda 表達式只有一個參數是很常見的,如果編譯器自己可以識別出簽名,也可以不用聲明唯一的參數並忽略 ->。,該參數會隱式聲明爲 it 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章