前言
你們好,這裏是「從零開始學 Kotlin 之『3』集合、數組和區間」,本文首發於公衆號「Binguner」,歡迎前往你們關注。 我會每週分享一些關於 Android 和其餘方向的技術乾貨或一些關於認知的文章。學習一門技術最好的方式就是去教會別人,因此,開始今天的學習吧!數組
Kotlin 中的集合和 Java 中的集合不同,分爲只讀集合和可變集合。函數
只讀集合只可以讀取集合中的元素,而可變集合才能夠對集合中的元素進行操做(Kotlin 爲了消除 Bug 也是想盡了辦法)。學習
只讀集合的聲明:ui
val numlist = listOf(1,2,3)
val numArraylist = arrayListOf(4,5,6)
val numHashSet = hashSetOf(7,8,9)
val numHashMap = hashMapOf("a" to 10,"b" to 11,"c" to 12)
println(numlist) // 輸出 [1, 2, 3]
println(numArraylist) //輸出[4, 5, 6]
println(numHashSet) //輸出[4, 5, 6]
println(numHashMap) //輸出{a=10, b=11, c=12}
複製代碼
注意:以上方式聲明的集合都不支持 add、addAll、clear 等增長或刪除數組元素對操做。this
可變集合的聲明:spa
val numMutablelist = mutableListOf(1,2,3)
val numMutableHashSet = mutableSetOf(7,8,9)
val numMutableHashMap = mutableMapOf("a" to 10,"b" to 11,"c" to 12)
println(numMutablelist) // 輸出[1, 2, 3]
println(numMutableHashSet) // 輸出[7, 8, 9]
println(numMutableHashMap) // 輸出{a=10, b=11, c=12}
numMutablelist.add(4)
println(numMutablelist) // 輸出[1, 2, 3, 4]
複製代碼
Kotlin 支持類型參數的可空性 Kotlin 中全部的泛型和泛型函數的類型參數都是可空的。code
var list = mutableListOf<Int?>()
複製代碼
可變集合的父類是 MutableCollection
,MutableCollection
的父類是 Collection
,Collection
只有 size、iterator、contains 等對集合的基本操做,MutableCollection
相較於 Collection
類,增長了 add、remove、clear 等操做集合的方法。cdn
這個方法會返回集合中沒有 Null 元素的集合。視頻
var list = listOf(1,2,3,null,4,null);
println(list) // 輸出 [1, 2, 3, null, 4, null]
println(list.filterNotNull()) // 輸出 [1, 2, 3, 4]
複製代碼
Kotlin 中使用 vararg
來聲明一個可變的參數。查看 listOf 的源碼,就能夠看到 vararg 的使用。對象
public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()
複製代碼
kotlin 中的 mapOf 函數就使用了中綴調用。
那麼到底什麼是中綴調用呢?
var map = mapOf(1 to "one",2 to "two", 3 to "three")
複製代碼
上面這行代碼中的 to
就是一箇中綴調用的函數名,中綴調用的時候,函數名直接放在兩個值之間。
下面來看一下 to
的源碼
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
複製代碼
Pair
類型表示一對元素。
因此咱們代碼中的 1.to("one")
等價於 1 to "one"
,但第二種寫法是否是更加簡單呢?
Kotlin 爲了使用數組,增長了 Array
和 Arrays
。
如今咱們來建立一個 String 類型的數組和 Int 類型的數組。 注:由於 String 不是基本類型,因此建立 String 類型的數組須要使用 arrayOf()。
var strArray = arrayOf("2","a","3")
println(strArray.joinToString(" ")) // 輸出 2 a 3
var intArray = intArrayOf(1,2,3,4,5,3)
println(intArray.joinToString(" ")) // 輸出 1 2 3 4 5 3
複製代碼
除此以外,還有其餘生成數組的方法
建立一個指定大小的可空數組,默認初始元素全爲 null。
var array = arrayOfNulls<Int>(3)
array[2] = 3
println(array.joinToString(" ")) // 輸出 null null 3
複製代碼
直接使用 IntArray、ByteArray、CharArray 等類型等構造函數來建立數組,須要傳入一個數組大小和初始化每一個元素等 lambda 表達式,不進行初始化的話,kotlin 會提供一個默認值。
var array = IntArray(4){
i -> i * 2
}
var array2 = BooleanArray(3)
println(array.joinToString(" ")) // 輸出 0 2 4 6
println(array2.joinToString(" ")) // 輸出 false false false
複製代碼
Kotlin 中區間的概念和數學上的差很少,也用來表示一個範圍,它是由具備操做符形式 ..
的 rangeTo
函數定義的。
下面爲來定義幾種不一樣的區間:
var range = 1 .. 5
for ( i in range){
print("$i ")
} // 輸出 1 2 3 4 5
複製代碼
var range = 1 until 5
for ( i in range){
print("$i ") // 輸出 1 2 3 4
}
複製代碼
var range = 5 downTo 1
for ( i in range){
print("$i ")
} // 輸出 5 4 3 2 1
複製代碼
var range = 1..5 step 2
for (i in range){
print("$i ") // 輸出 1 3 5
}
複製代碼
// 先定義一個 1 到 5 到區間
var range = 1 .. 5
// 對這個區間調用 `reversed()`
var range2 = range.reversed()
for ( i in range2){
print("$i ") // 輸出 5 4 3 2 1
}
複製代碼
in
用來檢查某個對象是否屬於集合,它對應對函數是 contains
。 !in
用來檢查某個對象是否不屬於集合 。
使用方法以下:
var range = 1 .. 5
println( 1 in range) // 輸出 true
println( 1 !in range1) // 輸出 false
複製代碼
Kotlin 提供了一下方法能夠直接將區間轉換爲集合
var range1 = 1 .. 5
var list = range1.toList()
println(list) // 輸出 [1, 2, 3, 4, 5]
複製代碼
固然還能轉換爲其餘類型,下面是 Kotlin 提供的方法。
「從零開始學 Kotlin 之『3』集合、數組和區間」到這裏就結束了。
一下記住這麼多知識點有些困難,因此爲了方便你們的記憶與複習,我作了一張思惟導圖放到下面,你們能夠把圖片保存下來,有時間便去回顧學到的東西。
推薦閱讀:
歡迎關注本文做者,這個系列的文章會首發在這裏:
掃碼關注 + 回覆「kotlin」,獲取我整理的最新版 Kotlin 學習視頻。