很多高級編程語言很早就支持Lambda編程,java從JDK1.8開始支持Lambda編程語法,而kotlin從第一版開始就支持Lambda編程,本章從集合的函式式API的使用做的Kotlin中Lambda入門,
一、Lambda運算式語法
lambda運算式完整語法:val sum: (Int, Int) -> Int = {x: Int, y: Int -> x + y} 即:{引數名1:引數型別,引數名2: 引數型別 -> 函式體},其中引數的個數可以是0個也可以是多個,
lambda表示是整體是在花括號中,引數和函式體用 -> 分割開,在Lambda是型別是可以自動推導的,所有上述表示也可以寫成 val sum = {x: Int, y: Int -> x + y} 或 val sum: (Int, Int) -> Int = {x, y -> x + y} ,
其中 (Int, Int) -> Int 是函式型別,表示是引數為2個Int值,回傳值是Int的函式型別,引數和回傳值用 -> 分隔開,引數個數也可以0個或者多個,回傳值為空Unit不可以省略,Lambda運算式不能指定回傳值型別,且最后一行自動最為其回傳值,關于函式型別相關知識后邊會詳細講到,
二、Lambda運算式的使用
data class Person(val age: Int, val name: String)
val persons = listOf(Person(16, "一諾"), Person(18, "紫萱"))
先看一個需求從persons中找出年齡最大的person,按照我們之前的未使用Lambda運算式之前的寫法很可能會是如下代碼:
fun getMaxAgePerson(): Person {
var maxAgePerson: Person = persons[0]
for (person in persons) {
if (person.age > maxAgePerson.age) {
maxAgePerson = person
}
}
return maxAgePerson
}
但如果我們使用集合的函式式API結合Lambda就可以很簡單的寫成如下方式:
maxAgePerson = persons.maxBy { it.age }
{it.age} 是Lambda的簡化寫法,下面我們一步步看下它的推導程序,
三、Lambda簡化用法的推導演化
首先查看 maxby 函式的定義:
public inline fun <T, R : Comparable<R>> Iterable<T>.maxBy(selector: (T) -> R): T? {
//....
}
可以看出 maxby 是一個Iterable<T> 的擴展函式,接收一個函式型別(引數是泛型T,回傳值為實作Comparable的型別R)的引數,同時也是行內函式,
第一步:所以我們我們第一步宣告一個此函式型別的Lambda運算式(不僅lambda運算式匿名函式、函式參考...也可以作為函式值)傳遞給maxby,
val lambda: (Person) -> Int = { person: Person -> person.age }
//根據Lambda的型別推導特性,可以寫成val lambda = { person: Person -> person.age }
maxAgePerson = persons.maxBy(lambda)
lambda作為引數傳遞給maxby,
第二步:我們直接把Lambda運算式傳傳遞到maxby中,
maxAgePerson = persons.maxBy({ person: Person -> person.age })
第三步:在kotlin中Lambda運算式作為函式最后一個引數時可以將Lambda運算式移到函式括號的外邊(匿名函式則不可以),可以寫成:
maxAgePerson = persons.maxBy(){ person: Person -> person.age }
第四步:在kotlin中Lambda運算式是函式的唯一引數引數時,可以將()省略,即:
maxAgePerson = persons.maxBy{ person: Person -> person.age }
第五步:從maxby的定義可以看出引數的函式型別中引數也是Iterable的泛型T,因此根據Kotlin的型別推導機制,可以不宣告引數型別,因此代碼可以進一步寫為:
maxAgePerson = persons.maxBy{ person -> person.age }
第六步:當Lambda運算式中只有一個引數時,可以不必宣告引數名而是用 it 代替,也因此可以寫成:
maxAgePerson = persons.maxBy{ it.age }
以上是maxby函式的簡化推導演化的程序,
四、常用的集合的函式式API
(1) filter 過濾集合中的資料,篩選出persons中年齡大于等于18的person:
val newPersons = persons.filter { it.age >= 18 }
(2)minby 和 maxby用法一樣篩選出集合中滿足條件的最小的元素,篩選中persons中年齡最小的person:
val minAgePerson = persons.minBy { it.age}
(3)map 將集合中的元素映射成另外的值,將persons中的person年齡加一歲:
val newPerson = persons.map { it.age + 1 }
(4)any 集合中是否至少有一個滿足條件的元素,persons中是否含有年齡大于等于18的person:
val isAnyPerson = persons.any { it.age >= 18 }
(5)all 和 any的用法一樣指是否集合中的元素是否全部滿足某個條件,persons中的person是否年齡全部大于等于18:
val isAllPerson = persons.all { it.age >= 18 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/292761.html
標籤:其他
上一篇:Android FFmpeg集成
下一篇:iOS—持久化的幾種方案
