今天就跟大家聊聊有关山姆函数怎么在芬兰湾的科特林中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
用λ表达式去表示java中的匿名类实例
在使用java去给一个按钮设置监听我们通常会通过创建匿名类实例,如下
Button.setOnClickListener (OnClickListener new ()) { @Override才能 public 才能;void  onClick (View v) { ,,,Toast.makeText(这一点,“Hello  World", Toast.LENGTH_LONG),告诉() ,,} }
在芬兰湾的科特林我们可以通过传递一个λ表达式去代替这个实例
btn_test.setOnClickListener {, view : view → ,,,,,Toast.makeText(这一点,“Hello  World", Toast.LENGTH_LONG),告诉() }
可以以这种方式去实现的原因是OnClickListener接口只有一个抽象方法,这种接口在芬兰湾的科特林中被当作函数式接口,或者萨姆接口,山姆代表单抽象方法,类似的还有像Runnable和调用这样的函数式接口。
<强>把λ当作参数传递给Java方法强>
我们在Java中定义一个
void postponeComputation (int 延迟,Runnable 计算){ }
然后使用λ表达式去传递Runnable这个参数
postponeComputation (1000) { ,,,印刷(“hello world") }
注意这个λ实参编译器会自动把它转换成一个可运行实例。这种调用方式效果和显示的实现一个Runnable匿名对象一样
postponeComputation(时间:1000年,object Runnable { ,,,override fun 运行(){ ,,,,,,,println (42) ,,,} })
但实际不一样的是,每次调用这种语句会重复创建Runnable对象,而使用λ表达式作为实参如果没有访问任何来自定义它的函数变量那么只会创建一个对象。
如果想要完全等价需要这样去定义
val runnable =, Runaable {, println (42)} fun handleComputation () { ,,postponeComputation(1000,可运行) }
另外如果从包围它的作用域中捕捉了变量,每次调用就不会重用同一个实例了,如下调用每次都会使用一个新的Runnable实例。
fun handleComputation (id :字符串){ ,,postponeComputation (1000) {println (id)} }
实际上从kotlin1.0起,每个λ都会被编译成一个匿名类,如果λ捕捉了变量,每个被捕捉的变量会在匿名类中有对应的字段。
<强>山姆构造方法:显式地把λ转换成函数式接口。强>
在有的方法中需要返回一个函数式接口,不能返回一个λ,可以用山姆构造方法把它包装起来。如下
fun createAllDoneRunable(),:,可运行{ return 才能Runnable {, println (“All 完成”),} }
山姆函数名称和底层函数式接口的名称一样。山姆构造方法只接收一个参数——一个被用作函数式接口单抽象方法体的λ,并返回一个接口类的实例。
另外除了返回值通过λ创建函数式接口外,也可以把λ生成的函数式接口放在一个变量中,如下
val listener OnClickListener=, { ,,view →val text =,当(view.id) { ,,,R.id.button1 →,“First 按钮” ,,,R.id.button2 →,“Second 按钮” ,,,else →,“Unknown button" ,,} ,,面包(文本) } button1.setOnClickListener(听众) button2.setOnClickListener(听众)
看完上述内容,你们对山姆函数怎么在芬兰湾的科特林中使用有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。