從零開始學 Kotlin 之「3」集合谱姓、數(shù)組和區(qū)間

前言

大家好,這里是「從零開始學 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 繼承關系

可變集合的父類是 MutableCollectionMutableCollection 的父類是 Collection透硝,Collection 只有 size狰闪、iterator、contains 等對集合的基本操作濒生,MutableCollection 相較于 Collection 類埋泵,增加了 add、remove甜攀、clear 等操作集合的方法秋泄。

01 - 3 對集合的操作

  1. 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]
  1. 可變參數(shù)

Kotlin 中使用 vararg 來聲明一個可變的參數(shù)。查看 listOf 的源碼恒序,就可以看到 vararg 的使用瘦麸。

public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()
  1. 中綴調(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ù)組崭参,增加了 ArrayArrays呵曹。

  • 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ù)組的方法

  1. 使用 arrayOfNulls

創(chuàng)建一個指定大小的可空數(shù)組吊说,默認初始元素全為 null固以。

var array = arrayOfNulls<Int>(3)
array[2] = 3

println(array.joinToString(" "))  // 輸出 null null 3
  1. 使用 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 提供的其他轉(zhuǎn)化方法

最后

「從零開始學 Kotlin 之『3』集合疫蔓、數(shù)組和區(qū)間」到這里就結(jié)束了。

一下記住這么多知識點有些困難身冬,所以為了方便大家的記憶與復習衅胀,我做了一張思維導圖放到下面,大家可以把圖片保存下來酥筝,有時間便去回顧學到的東西滚躯。

從零開始學 Kotlin 之「3」集合、數(shù)組和區(qū)間

推薦閱讀:

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘿歌,一起剝皮案震驚了整個濱河市掸掏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搅幅,老刑警劉巖阅束,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茄唐,居然都是意外死亡息裸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門沪编,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呼盆,“玉大人,你說我怎么就攤上這事蚁廓》闷裕” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵相嵌,是天一觀的道長腿时。 經(jīng)常有香客問我,道長饭宾,這世上最難降的妖魔是什么批糟? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮看铆,結(jié)果婚禮上徽鼎,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好否淤,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布悄但。 她就那樣靜靜地躺著,像睡著了一般石抡。 火紅的嫁衣襯著肌膚如雪檐嚣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天汁雷,我揣著相機與錄音净嘀,去河邊找鬼。 笑死侠讯,一個胖子當著我的面吹牛挖藏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播厢漩,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼膜眠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了溜嗜?” 一聲冷哼從身側(cè)響起宵膨,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炸宵,沒想到半個月后辟躏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡土全,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年捎琐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裹匙。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡瑞凑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出概页,到底是詐尸還是另有隱情籽御,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布惰匙,位于F島的核電站技掏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏项鬼。R本人自食惡果不足惜零截,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秃臣。 院中可真熱鬧,春花似錦、人聲如沸奥此。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稚虎。三九已至撤嫩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蠢终,已是汗流浹背序攘。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寻拂,地道東北人程奠。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像祭钉,于是被迫代替她去往敵國和親瞄沙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容