1戈盈、閉包
閉包:函數(shù)式編程,函數(shù)可以作為方法的返回值谆刨,也可以作為方法的參數(shù)塘娶,lambda表達(dá)式
fun test(): () -> Unit {
var a = 10
// 此處方法的返回值就是閉包
return {
println(a)
a++
}
}
fun main() {
val result = test()
result() // 10
result() // 11
result.invoke() // 12
}
2、高階函數(shù)
/**
* 普通函數(shù)
*/
fun add(a: Int, b: Int): Int {
return a + b
}
/**
* 普通函數(shù)
*/
fun sub(a: Int, b: Int): Int {
return a - b
}
/**
* 高階函數(shù)
* 需要兩個(gè) Int 參數(shù)和一個(gè)函數(shù)類型的參數(shù)
*/
fun cecl(a: Int, b: Int, block: (Int, Int) -> Int): Int {
//return block(a, b)
return block.invoke(a, b)
}
fun main() {
val a = 10
val b = 20
var sum = add(a, b)
var result = sub(a, b)
println(sum) // 30
println(result) // -10
// :: 表示函數(shù)的引用痴荐,類似于C/C++里的函數(shù)指針
sum = cecl(a, b, ::add)
println(sum) // 30
result = cecl(a, b, ::sub)
println(result) // -10
}
3血柳、lambda表達(dá)式
/**
* 高階函數(shù)
* 需要兩個(gè) Int 參數(shù)和一個(gè)函數(shù)類型的參數(shù)
*/
fun lambda(a: Int, b: Int, block: (Int, Int) -> Int): Int {
//return block(a, b)
return block.invoke(a, b)
}
fun lambda2(a: Int, block: (Int, Int) -> Int, b: Int): Int {
//return block(a, b)
return block.invoke(a, b)
}
fun main() {
val a = 10
val b = 20
// 1官册、匿名函數(shù)即 lambda 表達(dá)式
val sum = lambda(a, b, { m, n ->
m + n
})
println(sum) // 30
// 2生兆、lambda 表達(dá)式去括號(hào):當(dāng)函數(shù)最后一個(gè)參數(shù)為 lambda 表達(dá)式時(shí),可以放到括號(hào)外面?
val result = lambda(a, b) { m, n ->
m - n
}
println(result) // -10
val l3 = lambda2(a, { m, n ->
m + n
}, b)
println(l3);
// 3膝宁、無參 lambda 表達(dá)式
{
println("無參 lambda 表達(dá)式")
}();
{
println("無參 lambda 表達(dá)式")
}.invoke()
// 4鸦难、有參 lambda 表達(dá)式
val r1 = { a: Int, b: Int ->
println("有參 lambda 表達(dá)式")
a + b
}(10, 20)
println(r1) // 30
val r2 = { a: Int, b: Int ->
println("有參 lambda 表達(dá)式")
a - b
}?.invoke(10, 20)
println(r2) // -10
}