Kotlin函數(shù)式編程超詳細(xì)介紹
1.函數(shù)式編程
我們都知道java是面向?qū)ο缶幊谭妒?。在java的世界,一切皆對(duì)象。
函數(shù)式編程范式是有抽象數(shù)學(xué)的lambda演算發(fā)展而來(lái),主要依賴高階函數(shù)返回的數(shù)據(jù),這些高級(jí)函數(shù)專用于處理各種集合,可以方便的聯(lián)合多個(gè)函數(shù)構(gòu)建鏈?zhǔn)讲僮?,以?chuàng)建復(fù)雜的計(jì)算行為。
所謂高級(jí)函數(shù)就是以函數(shù)為參數(shù)或返回值是函數(shù)的函數(shù)。這點(diǎn),前面的文章,有過(guò)簡(jiǎn)單介紹。
2.函數(shù)類別
一個(gè)函數(shù)式應(yīng)用通常由這三大類組成,變化transform、過(guò)濾filter、合并combine。每類函數(shù)都針對(duì)集合數(shù)據(jù)類型設(shè)計(jì),目標(biāo)是產(chǎn)生一個(gè)最終結(jié)果。函數(shù)式編程用到的函數(shù)生來(lái)都是可以組合的。通過(guò)簡(jiǎn)單函數(shù)的組合來(lái)實(shí)現(xiàn)復(fù)雜的計(jì)算。
3.變換函數(shù)(transform)
變換函數(shù)會(huì)遍歷集合內(nèi)容,以值參的形式傳入變換器函數(shù),變換每一個(gè)元素,然后返回包含已修改元素的集合,傳給鏈上的其他函數(shù)。最常用的兩個(gè)變換函數(shù)是map和flatMap
map函數(shù):
1)map變換函數(shù),遍歷集合沒(méi)一個(gè)元素,通過(guò)變換器,變換成新的元素,并存入新的集合,然后返回變換后的集合作為鏈上下一個(gè)函數(shù)的輸入。
2)map轉(zhuǎn)換函數(shù)轉(zhuǎn)換后的集合和集合,大小是一樣的,并且不會(huì)改變?cè)系膬?nèi)容。
簡(jiǎn)而言之,就是講一個(gè)就集合變換成一個(gè)新集合
示例:list集合經(jīng)過(guò)map轉(zhuǎn)換器后,變成了Fruit集合
fun main() {
val list = listOf("Apple","Banana","pear")
val fruits = list.map {
Fruit(it)
}
list.forEach { println(it) }
fruits.forEach {
println(it.name)
}
}map函數(shù)定義
1)調(diào)用者Iterable<T>是一個(gè)集合類型,集合元素是T類型,返回值是: List<R>,集合元素是R類型
2).map(transform: (T) -> R) map接收一個(gè)transform匿名函數(shù),匿名函數(shù)的參數(shù)是T,返回值是R
public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)
}
public inline fun <T, R, C : MutableCollection<in R>> Iterable<T>.mapTo(destination: C, transform: (T) -> R): C {
for (item in this)
destination.add(transform(item))
return destination
}flatMap函數(shù):
flatMap操作的是集合的集合,將多個(gè)集合中的元素合并后,返回一個(gè)包含所有元素的集合。
fun main() {
val list = listOf("Apple","Banana","pear")
val list2 = listOf("orange","watermelon","lemon")
val newFruit = listOf(list,list2).flatMap { it }.map {
Fruit(it)
}
newFruit.forEach {
println(it)
}
}4.過(guò)濾函數(shù)(filter)
filter過(guò)濾函數(shù)接收一個(gè)predicate函數(shù)。如果predicate函數(shù)返回為true,受檢元素會(huì)添加到過(guò)濾后的新集合中,如果為fasle,則受檢元素就會(huì)被移除新集合。
通俗的講,就是講原集合按照過(guò)濾函數(shù)給定的條件,形成一個(gè)新的集合。
示例:在集合元素中,包含"a"的元素,形成新的集合。
fun main() {
val list = listOf("Apple","Banana","pear")
val newList = list.filter { it.contains("a") }
newList.forEach {
println(it)
}
}flat和filter配合使用示例:
fun main() {
val list = listOf("Apple","Banana","pear")
val list2 = listOf("orange","watermelon","lemon")
val newFruit = listOf(list,list2).flatMap { it }.map {
Fruit(it)
}.filter {
it.name.contains("a")
}
newFruit.forEach {
println(it)
}
}過(guò)濾偶數(shù):
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
val newList = numbers.filter {
it % 2 == 0
}
newList.forEach {
println(it)
}5.合并函數(shù)(combine)
zip函數(shù):用來(lái)合并兩個(gè)集合,形成一個(gè)新的鍵值對(duì)的集合??梢园堰@個(gè)集合轉(zhuǎn)成一個(gè)map集合
fun main() {
val list = listOf("Apple", "Banana", "pear")
val list2 = listOf("orange", "watermelon", "lemon")
val numbers = listOf(0,1, 2, 3, 4, 5)
val newFruit = numbers.zip( listOf(list, list2).flatMap { it } ).toMap()
newFruit.forEach { index, value ->
println("$index:$value")
}
}到此這篇關(guān)于Kotlin函數(shù)式編程超詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Kotlin函數(shù)式編程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android6.0動(dòng)態(tài)申請(qǐng)權(quán)限所遇到的問(wèn)題小結(jié)
這篇文章給大家介紹了Android6.0動(dòng)態(tài)申請(qǐng)權(quán)限所遇到的問(wèn)題,在沒(méi)給大家介紹這下問(wèn)題之前,先給大家說(shuō)下基本定義和基本使用方式,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,對(duì)android 6.0 動(dòng)態(tài)權(quán)限遇到問(wèn)題感興趣的朋友一起看看吧2016-11-11
Android?JetPack組件的支持庫(kù)Databinding詳解
DataBinding是Google發(fā)布的一個(gè)數(shù)據(jù)綁定框架,它能夠讓開發(fā)者減少重復(fù)性非常高的代碼,如findViewById這樣的操作。其核心優(yōu)勢(shì)是解決了數(shù)據(jù)分解映射到各個(gè)view的問(wèn)題,在MVVM框架中,實(shí)現(xiàn)的View和Viewmode的雙向數(shù)據(jù)綁定2022-08-08
Android App將數(shù)據(jù)寫入內(nèi)部存儲(chǔ)和外部存儲(chǔ)的示例
這篇文章主要介紹了Android App將數(shù)據(jù)寫入內(nèi)部存儲(chǔ)和外部存儲(chǔ)的示例,使用外部存儲(chǔ)即訪問(wèn)并寫入SD卡,需要的朋友可以參考下2016-03-03
Android自動(dòng)獲取輸入短信驗(yàn)證碼庫(kù)AutoVerifyCode詳解
這篇文章主要為大家詳細(xì)介紹了Android自動(dòng)獲取輸入短信驗(yàn)證碼庫(kù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
如何使用SurfaceView實(shí)現(xiàn)魚兒游動(dòng)動(dòng)畫
這篇文章主要教大家如何使用SurfaceView實(shí)現(xiàn)魚兒游動(dòng)動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Android矢量圖之VectorDrawable類自由填充色彩
這篇文章主要介紹了Android矢量圖之VectorDrawable類自由填充色彩的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05
Android短信驗(yàn)證碼自動(dòng)填寫實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android短信驗(yàn)證碼自動(dòng)填寫實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05

