kotlin函数编程

中缀

infix 修饰的function ,只能是成员函数或者扩展函数 并且有一个参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Test14 {
//只有一个参数的成员函数 , 使用infix修饰
   infix fun test(age : Int) {
}
fun test(age : Int , name: String) {
}
}
//扩展函数
infix fun String.add(name: String) = this.plus(name)

fun main() {
Test14() test 1
"" add ""
}

内联

使用高阶函数会带来一些运行时的效率损失:每一个函数都是一个对象,并且会捕获一个闭包。 闭包那些在函数体内会访问到的变量的作用域。 内存分配(对于函数对象和类)和虚拟调用会引入运行时间开销。

但是在许多情况下通过内联化 lambda 表达式可以消除这类的开销。内联会把被调用处的函数体移植到调用处来 。

内联会使得包体积增大

1
2
inline fun String.add(name: String) = this.plus(name)

带有接收者的函数字面值

示例1

1
2
var subtract : Int.(Int) -> Int = {this - it}
println(3.subtract(2))

示例2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class People12{
var age: Int = 0
var name : String = ""
}

fun test(block: (People12) -> Unit) {
block(People12())
}

//函数block的接受者就是 People12,类似于给People12添加了扩展函数的感觉
fun test15(block: People12.() -> Unit) {
People12().block()
}

fun main() {
test {
people ->
people.name = ""
people.age= 2
}

test15 {
age = 12
name = ""
}

}