中缀
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 = "" }
}
|