前言
大家好,這里是「從零開始學 Kotlin 之『3』集合刨晴、數(shù)組和區(qū)間」屉来,本文首發(fā)于公眾號「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 等增加或刪除數(shù)組元素對操作。
- 可變集合
可變集合的聲明:
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 支持類型參數(shù)的可空性讨韭。
Kotlin 中所有的泛型和泛型函數(shù)的類型參數(shù)都是可空的脂信。
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]
- 可變參數(shù)
Kotlin 中使用 vararg
來聲明一個可變的參數(shù)。查看 listOf 的源碼恒序,就可以看到 vararg 的使用瘦麸。
public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()
- 中綴調(diào)用(infix function)
kotlin 中的 mapOf 函數(shù)就使用了中綴調(diào)用。
那么到底什么是中綴調(diào)用呢歧胁?
var map = mapOf(1 to "one",2 to "two", 3 to "three")
上面這行代碼中的 to
就是一個中綴調(diào)用的函數(shù)名滋饲,中綴調(diào)用的時候,函數(shù)名直接放在兩個值之間喊巍。
下面來看一下 to
的源碼
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
Pair
類型表示一對元素
所以我們代碼中的 1.to("one")
等價于 1 to "one"
屠缭,但第二種寫法是不是更加簡單呢?
02 數(shù)組
02 - 1 創(chuàng)建數(shù)組
Kotlin 為了使用數(shù)組崭参,增加了 Array
和 Arrays
呵曹。
- Array 由 arrayOf() 創(chuàng)建并返回,可以生成任意參數(shù)類型的數(shù)組何暮。
- Arrays 可以創(chuàng)建各種基本數(shù)據(jù)類型的數(shù)組奄喂,比如說 ByteArray、CharArray海洼、ShortArray跨新、IntArray、LongArray坏逢、FloatArray域帐、DoubleArray、BooleanArray是整,對應的生成方法是 byteArrayOf()肖揣、charArrayOf() 等。
現(xiàn)在我們來創(chuàng)建一個 String 類型的數(shù)組和 Int 類型的數(shù)組浮入。
注:因為 String 不是基本類型蹈集,所以創(chuàng)建 String 類型的數(shù)組需要使用 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 其他創(chuàng)建數(shù)組的方法
除此之外盐类,還有其他生成數(shù)組的方法
- 使用 arrayOfNulls
創(chuàng)建一個指定大小的可空數(shù)組吊说,默認初始元素全為 null固以。
var array = arrayOfNulls<Int>(3)
array[2] = 3
println(array.joinToString(" ")) // 輸出 null null 3
- 使用 Array 的構造方法
直接使用 IntArray众旗、ByteArray贪壳、CharArray 等類型等構造函數(shù)來創(chuàng)建數(shù)組堵泽,需要傳入一個數(shù)組大小和初始化每個元素等 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 區(qū)間
Kotlin 中區(qū)間的概念和數(shù)學上的差不多巢掺,也用來表示一個范圍句伶,它是由具有操作符形式 ..
的 rangeTo
函數(shù)定義的劲蜻。
03 - 1 定義區(qū)間
下面為來定義幾種不同的區(qū)間:
- 閉區(qū)間
var range = 1 .. 5
for ( i in range){
print("$i ")
} // 輸出 1 2 3 4 5
- 半閉區(qū)間
var range = 1 until 5
for ( i in range){
print("$i ") // 輸出 1 2 3 4
}
- 倒序區(qū)間
var range = 5 downTo 1
for ( i in range){
print("$i ")
} // 輸出 5 4 3 2 1
- 自定義步長的區(qū)間
var range = 1..5 step 2
for (i in range){
print("$i ") // 輸出 1 3 5
}
- 反轉(zhuǎn)序列
// 先定義一個 1 到 5 到區(qū)間
var range = 1 .. 5
// 對這個區(qū)間調(diào)用 `reversed()`
var range2 = range.reversed()
for ( i in range2){
print("$i ") // 輸出 5 4 3 2 1
}
03 - 2 對區(qū)間的操作
1. in 和 !in
in
用來檢查某個對象是否屬于集合,它對應對函數(shù)是 contains
考余。
!in
用來檢查某個對象是否不屬于集合 先嬉。
使用方法如下:
var range = 1 .. 5
println( 1 in range) // 輸出 true
println( 1 !in range1) // 輸出 false
2. 將區(qū)間轉(zhuǎn)換為其他類型
Kotlin 提供了一下方法可以直接將區(qū)間轉(zhuǎn)換為集合
var range1 = 1 .. 5
var list = range1.toList()
println(list) // 輸出 [1, 2, 3, 4, 5]
當然還能轉(zhuǎn)換為其他類型,下面是 Kotlin 提供的方法楚堤。
最后
「從零開始學 Kotlin 之『3』集合疫蔓、數(shù)組和區(qū)間」到這里就結(jié)束了。
一下記住這么多知識點有些困難身冬,所以為了方便大家的記憶與復習衅胀,我做了一張思維導圖放到下面,大家可以把圖片保存下來酥筝,有時間便去回顧學到的東西滚躯。
推薦閱讀: