从本质上说: 闭包 == 函数 == Java Lamda 表达式 == Java 只有一个方法的类或接口闭包
闭包和函数的参数列表及返回值类型相同时能够相互转化函数
格式:this
{ 调用参数列表 -> 执行体,最后一句返回值 }
如code
var f0 = { x: Int, y: String -> x = x + 1 y + x // y+x 的结果将为返回值 } z = f0( 1, "hello") //将闭包当场函数调用 val k: ( (Int,String)->String ) = f0 //OK val l: ( ()->Unit ) = f0 //error, l 的类型与 x的类型不一样 fun f1( a1: Int, a2: String): String { return "world" } f0 = f1 //OK , 函数的类型与闭包的类型相同
只有一个参数的闭包 能够省略 调用参数列表 ->
, 隐含的实际参数为 it
对象
var f0: (String)->Unit = { println( it ) // it 表明传入参数 } f0("hello") //打印出 hello
扩展函数的本质是隐藏的 接收者 的函数,并不能调用 接收者 的 private
属性和方法接口
格式:it
fun 接收者类型 . 扩展函数名 (参数列表) : 返回值类型 { 函数体 }
调用扩展
接收者 . 扩展函数名 (参数列表)
如方法
// fun String.myfun( i: Int) : Int { return this.length * i // this 指向接收者对象 } "hello".myfun(2) // 得10
扩展函数 和 接收者为第一个参数的普通函数 是等效的error
扩展函数能够做为参数传给其余函数
如
// f 是扩展函数 fun my( f : String.(Int)->Unit ) { "abc".f(1) // f("abc",1) //和上一句的效果相同 } val f1 = { a1: String, a2: Int -> // Unit //返回Unit } my( f1 ) // OK, f1的类型为 (String,Int)-Unit , 与 String.(Int)->Unit 是等价的