下篇:第五篇:Kotlin之函數(shù)和Lambda表達(dá)式
一.Kotlin數(shù)組
? ? kotlin為數(shù)組增加了一個(gè)Array類禁漓,為元素是基本類型的數(shù)組增加了xxArray類(其中xx也就是Byte蜒犯,Short, Int等基本類型)
Kotlin創(chuàng)建數(shù)組大致有如下兩種方式:
1.使用arrayOf(), arrayOfNulls(),emptyArray()工具函數(shù)端姚。
2.使用Array(size: Int, init:(Int) -> T)
首先先介紹第一種
Array第二種用到了函數(shù)的知識(shí)设褐,本來想到函數(shù)的到后面函數(shù)那個(gè)章節(jié)在講,不過怕忘了泡挺,就先簡(jiǎn)單的說說吧辈讶。
Array(size: Int, ?init: (Int) -> T) 第一個(gè)參數(shù)就是對(duì)數(shù)組設(shè)置的大小很好理解。那么第二個(gè)參數(shù)是什么娄猫。 其實(shí)在kotlin里中參數(shù)也可以定義某個(gè)方法的類型的贱除。哇生闲,感覺很神奇吧!我們?cè)趯慾ava的時(shí)候基本上就是參數(shù)要不傳普通類型要不就是對(duì)象類型月幌,沒有聽說過可以傳方法類型的碍讯。 因?yàn)樵趉otlin里中方法其實(shí)也是有類型的。所以第二個(gè)參數(shù) init:(Int) -> T 代表這這個(gè)方法返回的類型是T只能有一個(gè)參數(shù)類型是Int型扯躺。雖然沒有看源碼捉兴,但是從它的字面是就可以看出這個(gè)參數(shù)其實(shí)就是對(duì)array的每個(gè)索引進(jìn)行初始化的。Int就是該array的所對(duì)應(yīng)的索引录语。下面看一下這個(gè)代碼:
看過我以前的文章的朋友應(yīng)該知道這個(gè)it代表什么了吧倍啥,就是代表(Int)的參數(shù)傳入的值,也就是array的下標(biāo)的索引澎埠。arrayInit的結(jié)果就是每個(gè)下標(biāo)的索引所對(duì)應(yīng)的值為下標(biāo)索引 * 2虽缕, arrayInitTwo下標(biāo)索引對(duì)應(yīng)的值就是索引值。在接下來的Kotlin值函數(shù)的文章中我會(huì)具體講講kotlin函數(shù)的用法蒲稳。
其實(shí)有些朋友也許會(huì)有這樣的疑慮彼宠,為什么在寫數(shù)組的時(shí)候有的時(shí)候需要指定泛型,有的時(shí)候不需要呢弟塞。其實(shí)你記住一點(diǎn)就可以了凭峡,在初始化的時(shí)候如果你是已經(jīng)將參數(shù)寫進(jìn)去了,kotlin用自動(dòng)識(shí)別的就不需要指定泛型了决记,如果只是指定大小沒有寫入?yún)?shù)的話摧冀。因?yàn)閗otlin不知道需要什么類型,所以需要指定泛型系宫。kotlin還提供了一個(gè)emptyArray()函數(shù)索昂,用法基本一致,這種方式創(chuàng)建了一個(gè)長(zhǎng)度為0的空數(shù)組扩借。
如果細(xì)心的朋友應(yīng)該注意到椒惨,我在寫kotlin數(shù)組的時(shí)候,取值或者賦值也用到了get潮罪,set方法康谆。所以koltin中不只有集合可以用,數(shù)組也可以用嫉到。 遍歷數(shù)組用 for in就好沃暗。
kotlin里數(shù)組提供了很多工具方法,例如
asList() 將該數(shù)組轉(zhuǎn)成list的集合何恶。
arr.all({it > 20}) 判斷是否數(shù)組里的值都大于20孽锥,如果是返回true,不是返回false
arr.any({it > 20})判斷是否數(shù)組里的值其中有一個(gè)大于20,如果是返回true惜辑,不是返回false
根據(jù)數(shù)組元素來計(jì)算<k, V>對(duì)唬涧,返回所有的<k, V>對(duì)組成的Map集合。例如 k + 2盛撑, v + 10
var arrMap = arr.associate({it + 2 to it + 10})
將數(shù)組arr的第5個(gè)元素(包括)到底7個(gè)元素(不包括)賦值為1
arr.fill(1, 4, 6)
還有很多工具方法碎节,可以去kotlin官方查看,在這里我就不一一列舉啦撵彻。還有多維數(shù)組钓株,跟java的多維數(shù)組一樣实牡。
2.Kotlin集合
kotlin集合類同樣有兩個(gè)接口派生:Collection和Map陌僵。但Kotlin的結(jié)合被分成兩個(gè)大類,可變集合和不可變集合创坞。只有可變集合才可以添加修改碗短,刪除等處理操作。不可變集合只能讀取元素题涨。
上圖為kotlin提供的集合偎谁,通過上圖可以看出kotlin的集合實(shí)現(xiàn)類比java更少,他只是提供了HashSet纲堵, LinkedHashSet巡雨, ArrayList這三個(gè)常見的實(shí)現(xiàn)類,如果開發(fā)者需要使用TreeSet席函, LinkedList集合實(shí)現(xiàn)類依然可以使用java集合框架提供的類铐望。
縱觀Kotlin集合體系,不難發(fā)現(xiàn)kotlin只提供了HashSet茂附,HashMap正蛙, LinkedHashSet, LinkedHashMap营曼, ArrayList這5個(gè)集合實(shí)現(xiàn)類乒验,而且他們都是可變集合,那么說好的不可變集合呢蒂阱。kotlin的不可變集合類并沒有暴露出來锻全,我們只能通過函數(shù)來創(chuàng)建不可變集合。
set集合录煤,Kotlin提供了如下函數(shù)來創(chuàng)建Set集合
setOf();該函數(shù)返回不可變的Set集合虱痕,該集合可以接收0個(gè)或過個(gè)參數(shù),這些參數(shù)將作為集合的元素辐赞。
mutableSet0f():該函數(shù)返回可變的MutableSet集合部翘,
hashSetOf():該函數(shù)返回可變的HashSet集合,
linkedSetOf():該函數(shù)返回可變的LinkedHashSet集合响委。
sortedSetOf():該函數(shù)返回可變的TreeSet集合, 用法同下新思。
在kotlin1.1的時(shí)候setof返回的類型就是linkedHashset窖梁。 setof, linkedSetOf是有序的夹囚, hashSetOf和sortedSetOf是無序的纵刘。 所以好多朋友都是set是無序的,我感覺這樣說很片面荸哟。
set集合的工具方法里有
all假哎, any, associateBy 和數(shù)組的一樣鞍历,用法也一樣就不解釋了舵抹。
set.drop(2) 返回刪除set集合前面兩個(gè)元素后的集合。
set.filter({"java" in it}) ?對(duì)set集合進(jìn)行過濾劣砍,返回包含java的集合惧蛹。
set.find({"java" in it}) 如果集合里元素有可以包含java的返回true,否者返回false
set.add; ? set.remove; ?set.clear ...跟java一樣刑枝。(set集合不允許重復(fù)香嗓,java也是一樣)
還有去兩個(gè)集合的交集,并集等等装畅。方法還有很多靠娱。如有興趣請(qǐng)查看kotlin官網(wǎng)。
list集合掠兄,Kotlin提供了如下函數(shù)來創(chuàng)建list集合
listOf(); 返回不可變的集合
listOfNull(); 返回不可變集合像云,和前一個(gè)函數(shù)的唯一的區(qū)別是,該函數(shù)會(huì)自動(dòng)去掉傳入的null徽千,也就是說返回的時(shí)候不會(huì)返回null苫费,會(huì)過濾掉。
mutableListOf(); 該函數(shù)返回可變的MutableListOf()集合
第一個(gè)listOf實(shí)際上返回的是ArrayList
使用list的方法:
list.indexOf("java")取得坐標(biāo)的位置双抽。
list.subList 返回List的子集合百框。list.subList(1, 3) 包含1不包含3
工具類和set很相似,具體的可以自己嘗試一下牍汹。
Map集合
mapOf(); 該函數(shù)返回不可變的Map集合铐维。
mutableMapOf(); 該函數(shù)返回可變的MutableMap集合。
其實(shí)mapOf() 返回的是LinkedHashMap()慎菲。
hashMapOf(); 返回可變的HashMap()集合隧膘。
linkedMapOf(); 返回可變的LinkedHashMap集合辫狼。
Kotlin為Map集合同樣擴(kuò)展大量方法桦锄,這些方法與Kotlin為Set集合提供的方法也大致相似乍惊。卻別就是對(duì)key-value進(jìn)行了調(diào)整。?
map.all({it.key.length > 5 && it.value.length > 5})
map.filter({"java" in it.value}) ? 。抑党。
對(duì)于map的添加刪除和java一樣 put包警, remove。我就不舉例子了底靠。
遍歷map
for(en in map.entries) {}
for(key in map.keys) {}
for(value in map.value) {}
map還可以用map[key] = value,來代替map.put("key", value)
? ? 到這里kotlin的數(shù)組和集合基本的用法基本上講完了害晦,其實(shí)和java的數(shù)組和集合基本相似,就是多了一些可變集合和不可變集合暑中,以及提供的方法更多了一些壹瘟,方便我們開發(fā)。其實(shí)kotlin自己并沒有實(shí)現(xiàn)任何集合與數(shù)組都是調(diào)用java的鳄逾。所以對(duì)于最求性能的開發(fā)者來說完全可以按照java的結(jié)合的每個(gè)的優(yōu)點(diǎn)缺點(diǎn)來調(diào)用就好稻轨。
?感覺還不錯(cuò)的小伙伴記得點(diǎn)贊或者關(guān)注啊~~~ ?下一篇函數(shù)和lambda表達(dá)式會(huì)近期更新。