從零開始學 Kotlin 之「3」集合、陣列和區間
前言
大家好,這裡是「從零開始學 Kotlin 之『3』集合、陣列和區間」,本文首發於公眾號「Binguner」,歡迎前往大家關注。
我會每週分享一些關於 Android 和其他方向的技術乾貨或一些關於認知的文章。學習一門技術最好的方式就是去教會別人,所以,開始今天的學習吧!
01 只讀集合 和 可變集合
Kotlin 中的集合和 Java 中的集合不一樣,分為 只讀集合 和 可變集合 。
只讀集合只能夠讀取集合中的元素,而可變集合才可以對集合中的元素進行操作(Kotlin 為了消除 Bug 也是想盡了辦法)。
01 - 1 集合的宣告
- 只讀集合
只讀集合的宣告:
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 等增加或刪除陣列元素對操作。
- 可變集合
可變集合的宣告:
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 中所有的泛型和泛型函式的型別引數都是可空的。
var list = mutableListOf<Int?>()
01 - 2 繼承關係
可變集合的父類是 MutableCollection
, MutableCollection
的父類是 Collection
, Collection
只有 size、iterator、contains 等對集合的基本操作, MutableCollection
相較於 Collection
類,增加了 add、remove、clear 等操作集合的方法。
01 - 3 對集合的操作
- filterNotNull()
這個方法會返回集合中 沒有 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()
- 中綴呼叫(infix function)
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"
,但第二種寫法是不是更加簡單呢?
02 陣列
02 - 1 建立陣列
Kotlin 為了使用陣列,增加了 Array
和 Arrays
。
- Array 由 arrayOf() 建立並返回,可以生成任意引數型別的陣列。
- Arrays 可以建立各種基本資料型別的陣列,比如說 ByteArray、CharArray、ShortArray、IntArray、LongArray、FloatArray、DoubleArray、BooleanArray,對應的生成方法是 byteArrayOf()、charArrayOf() 等。
現在我們來建立一個 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
02 - 2 其他建立陣列的方法
除此之外,還有其他生成陣列的方法
- 使用 arrayOfNulls
建立一個指定大小的 可空 陣列,預設初始元素全為 null。
var array = arrayOfNulls<Int>(3) array[2] = 3 println(array.joinToString(" "))// 輸出 null null 3
- 使用 Array 的構造方法
直接使用 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
03 區間
Kotlin 中區間的概念和數學上的差不多,也用來表示一個範圍,它是由具有操作符形式 ..
的 rangeTo
函式定義的。
03 - 1 定義區間
下面為來定義幾種不同的區間:
- 閉區間
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 }
03 - 2 對區間的操作
1. in 和 !in
in
用來檢查某個物件是否屬於集合,它對應對函式是 contains
。
!in
用來檢查某個物件是否不屬於集合 。
使用方法如下:
var range = 1 .. 5 println( 1 in range)// 輸出 true println( 1 !in range1)// 輸出 false
2. 將區間轉換為其他型別
Kotlin 提供了一下方法可以直接將區間轉換為集合
var range1 = 1 .. 5 var list = range1.toList() println(list)// 輸出 [1, 2, 3, 4, 5]
當然還能轉換為其他型別,下面是 Kotlin 提供的方法。

Kotlin 提供的其他轉化方法
最後
「從零開始學 Kotlin 之『3』集合、陣列和區間」到這裡就結束了。
一下記住這麼多知識點有些困難,所以為了方便大家的記憶與複習,我做了一張思維導圖放到下面,大家可以把圖片儲存下來,有時間便去回顧學到的東西。

從零開始學 Kotlin 之「3」集合、陣列和區間
推薦閱讀:
- 5G0KK1XpCvDDg" target="_blank" rel="nofollow,noindex">從零開始學 Kotlin 之「1」基礎篇
- 從零開始學 Kotlin 之「2」資料型別
歡迎關注本文作者,這個系列的文章會首發在這裡:

掃碼關注 + 回覆「kotlin」,獲取我整理的最新版 Kotlin 學習視訊。