Kotlin之集合的函式式API Lambda

2021-10-07 07:45:51 字數 2654 閱讀 5538

集合的函式式 api 有很多種,我們只重點學習函式式 api 的結構,也就是 lambda 表示式的語法結構

要求:在集合中找出名字最長的那個值:

fun

main()

}print

("max is $maxlength"

)}

以上雖然說是一段很清晰的**,但是如果使用函式式程式設計,可以變的更加簡單:

fun

main()

print

("max is $maxlength"

)}

以上就是函式式 api 的用法,只用一行**就可以找到最長的名字,現在看可能還會摸不著頭腦,那是因為我們還沒有學習 lambda 表示式的語法結構,那就上 lambda 的語法結構

lambda 是一小段可以作為引數傳遞的**

一般來說,我們向某個函式傳參時只能傳入變數,而借助 lambda 卻可以傳入一小段**,那麼多長才算一小段**呢?kotlin 沒有對此進行限制,但通常不建議在 lambda 中寫太長的**,否則可能會影響**的可讀性

lambda 語法結構

首先最外層是乙個大括號,如果有資料傳入到 lambda 表示式當中的話,我們還需要宣告引數列表,引數列表的結尾使用的是 -> 符號,表示引數列表的結束以及函式體的開始,並且最後一行會自動作為 lambda 的返回值

在很多情況下,我們不需要使用 lambda 的完整的語法結構,而是有很多種簡化的寫法,但是簡化版的似乎更難理解,我們一步步推倒簡化版的由來,從而理解 lambda 表示式的語法結構

回到剛才尋找最長單詞的要求,前面使用的函式式 api 的語法結構看上去好像很特殊,但其實 maxby 就是乙個普通的函式而已,只不過他接收的是乙個 lambda 型別的引數,並且在遍歷集合的時候將每次遍歷的值作為引數傳給 lambda 表示式. maxby 函式的工作原理是根據我們傳入的條件來遍歷集合,從而找到該條件下的最大值,所以說剛好符合我們查詢最大長度的單詞的需求

現在來演示一下推倒過程

根據以上的工作原理可得:

fun

main()

val maxlength = list.

maxby

(lambda)

print

("max is $maxlength"

)}

可以看到 maxby 函式實質上就是接收了乙個 lambda 函式而已,並且這個 lambda 函式完全可以按照剛剛說的表示式的語法結構來定義

這種寫法雖然可以工作,但是比較囉嗦,可簡化的點也很多

首先,我們不需要專門定義乙個lambda變數,而是可以將lambda表示式直接傳入函式當中:

val maxlength = list.

maxby

()

kotlin規定,當lambda引數是函式的最後乙個引數時,可以將 lambda 表示式移動到函式的括號外面:

val maxlength = list.

maxby()

如果 lambda 引數是函式唯一的引數的話,還可以將函式的括號省略:

val maxlength = list.

maxby

由於 kotlin 擁有出色的型別推到極致, lambda 表示式中的引數在大多數情況下不必宣告引數型別:

val maxlength = list.

maxby

當 lambda 表示式的引數列表中只有陽光引數時,也不用宣告引數名,可以使用 it 關鍵字來代替:

val maxlength = list.

maxby

這就是最初的我們的那種寫法

map集合中的 map 函式是最常用的一種函式式 api ,他用於將集合中的每個元素都對映成乙個另外的值,對映的規則在 lambda 表示式中指定,最終生成乙個新的集合. 比如我們把所有的名稱都變成大寫:

fun

main()

for(name in maxlength)

}

map 的功能非常強大,他可以按照我們的需求對集合中的元素進行任意的對映轉換,只需要在 lambda 中編寫你需要的邏輯即可

filter

filter 函式是用來過濾集合中的資料都,他可以單獨使用,也可以配合剛才的 map 函式一起使用

比如我們只保留兩個字母以內的,就可以借助 filter 來實現

fun

main()

.map

for(name in maxlength)

}

需要注意呼叫順序來提高效率

any和all

any 用於判斷集合中是否至少存在乙個元素滿足指定條件

all 用於判斷集合中是否所有的元素都滿足指定條件

fun

main()

val allresult = list.

allprintln

("anyresult is $anyresult, allresult is $allresult"

)}

kotlin 特殊集合之序列

1.先看段 直觀感受序列的優點,速度快 1 序列操作又稱惰性集合操作,在對集合進行鏈式操作 對映 過濾 變換 不需要像普通集合那樣,每進行一次資料操作都需要開闢新的記憶體儲存中間結果 author hc date 2019 09 25 12 05 fun main args array map su...

Kotlin 函式式程式設計 一

今天開始學習kotlin的第二大思想,函式式程式設計。函式式程式設計在中一切都是函式。核心概念 函式和其它資料型別是一樣的,可以作為其它函式的引數傳入,也可做為函式的返回值。使用表示式,不用語句。高階函式 乙個函式可做為另乙個函式的引數和返回值 無 函式執行過程會返回乙個結果,不會修改外部變數 函式...

kotlin集合的遍歷

mutablelist 可變集合list 不可變集合 只能取,不能新增和修改 發現不可變集合 新增元素會報錯 迴圈遞增,不包含最後一位 比如 0 util 10 實際上是 0 到9 val listtype type object typetoken type printsettinglist sh...