# 1. 什么是高階函數
`Lambda`表達式還可以作為函數的**實際參數或者返回值**存在,而這種聲明,在`Kotlin`中叫做**高階函數**。
# 2. 將Lambda作為參數
比如下面的案例:
~~~
/**
* 排序列表
*/
fun sort(list: List<Int>, function: (Int, Int) -> Boolean): List<Int> {
var temp = list.toMutableList()
var len = list.size
for(i in 0..(len - 1)){
var index = i
for(j in (i+1)..(len - 1)){
if(function(temp[index], temp[j])){
index = j
}
}
if(index != i){
var t = temp[i]
temp[i] = temp[index]
temp[index] = t
}
}
return temp
}
fun printList(list: List<Int>){
for (i in list) {
print("${i}\t")
}
println()
}
fun main() {
var a = listOf<Int>(1, 2, 3, 4, 1, 8, 0)
var temp = sort(a, {c: Int, b: Int -> c > b})
printList(temp)
}
~~~
結果:
```
0 1 1 2 3 4 8
```
當然如果需要逆序,只需要修改為:
```
var temp = sort(a, {c: Int, b: Int -> c < b})
```
上面的案例是兩個參數的情況,這里有種特殊情況:函數類型滿足**只接收一個參數**的要求,可以用`it`關鍵字代替函數的形參以及箭頭。比如下面的案例:
~~~
/**
* 判斷一個數是否是2的n次冪
*/
fun Int.judgement(condition: (Int) -> Boolean): Boolean {
return condition(this)
}
fun main() {
var a = 4
// var result = a.judgement({ x: Int -> (x.and (x - 1)) == 0 })
var result = a.judgement { (it.and (it - 1)) == 0 }
println(result)
}
~~~
# 3. 作為返回值
在[Kotlin從基礎到實戰-黑馬程序員編著-微信讀書 (qq.com)](https://weread.qq.com/web/reader/ab3320e0718ade85ab3fd1cka87322c014a87ff679a21ea)這本書中給了一個案例,感覺能很好的說明這個問題,這里摘要一下。模擬普通用戶與`VIP`用戶購物的案例:
~~~
/**
* 會員打8折
*/
fun getPrice(user: USER): (Double) -> Double{
if(user == USER.NORMAL){
return {it}
}
return {it -> it * 0.8}
}
fun main() {
// 因為返回的是一個函數,所以還可以進行傳入一個Double類型的數據,然后執行
println(getPrice(USER.NORMAL)(300.0))
println(getPrice(USER.VIP)(300.0))
}
~~~
結果:
```
300.0
240.0
```
- Kotlin語言基礎
- Kotlin的簡介
- Kotlin的變量和常見數據類型
- Kotlin的區間
- Kotlin的位運算
- Kotlin的容器
- Kotlin類型檢查
- Kotlin的空值處理
- Kotlin的函數
- Kotlin的類
- Kotlin的委托
- Kotlin的延遲加載
- Kotlin的異常
- Kotlin的Lambda表達式
- Kotlin的高階函數
- Kotlin的標準庫中的高階函數
- Kotlin的泛型
- Kotlin的表達式
- Kotlin的解構
- Kotlin的運算符重載
- Kotlin語言中級
- Kotlin的擴展函數
- Kotlin的擴展屬性
- Kotlin的infix關鍵字
- Kotlin的DSL
- Kotlin的一些注解(和Java互調用)
- Kotlin的lateinit和by lazy
- Kotlin的反射
- Kotlin的匿名接口
- 安卓中的Kotlin
- 數據庫操作Room