hzq*_*elf 7 kotlin functional-interface
此功能即将推出Kotlin 1.4。这是摘录自KotlinConf'19.
fun interface Action {
fun run()
}
fun runAction(a: Action) = a.run()
runAction{
println("Hello")
}
Run Code Online (Sandbox Code Playgroud)
看起来不错,但我仍然不知道它有什么作用。
什么是函数接口?它的实用价值是什么?它可以用于哪些具体场景?
gid*_*dds 25
这是关于函数式接口——具有单一抽象方法的接口(也称为 SAM 接口)。
为了理解这一点,我需要介绍一些历史……在 Java 中,lambdas 是最近才添加的。在此之前,您通过实现合适的接口来实现回调等。例如,如果您想在 AWT 组件被操作时收到通知,您可以创建一个实现该ActionListener接口的对象。那有一个方法(称为actionPerformed());你会把你的代码放在那个方法中:
myButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Do something
}
});
Run Code Online (Sandbox Code Playgroud)
当他们添加 lambda 时,他们希望与所有现有代码混合,并尽可能少更改,因此他们以完全相同的方式进行操作:编译器推断您正在实现哪个接口,并创建一个实现该接口的对象。你可以写:
myButton.addActionListener(e -> {
// Do something
});
Run Code Online (Sandbox Code Playgroud)
这是更短的 - 但它编译后与第一个示例几乎相同。
所以在 Java 中,函数不是一等对象;lambda 只是实现函数式接口的更简洁的方法。
然而,在 Kotlin 中,函数是一等对象:您可以自己编写 lambda(或匿名函数)、分配它、将其传递给函数、从函数中返回它等等——所以不需要 SAM接口!
为了更轻松地与 Java 进行互操作,Kotlin 允许您轻松实现 Java SAM 接口,就像在 Java 中所做的一样:
myButton.addActionListener {
// Do something
}
Run Code Online (Sandbox Code Playgroud)
但是 Kotlin <= 1.3 不允许您以这种方式实现 Kotlin 接口;你需要明确地实现这些。(我怀疑这部分是为了鼓励开发人员使用具有所有其他优势的适当函数,而不是依赖 Java 风格的解决方法。)
你的例子说明了这一点。它有一个接口 ( Action) 和一个抽象方法 ( run())。它有一个函数 ( runAction()),它接受该接口的一个实例。它有一些代码想要调用该函数,只传递该run()方法的代码。
在 Kotlin <= 1.3 中,您必须明确地执行后者,例如:
runAction(object : Action {
override fun run() {
println("Hello")
}
})
Run Code Online (Sandbox Code Playgroud)
但是从 Kotlin 1.4 开始,您可以将界面标记为fun interface,并使用 Java 样式的快捷方式,如您的示例所示。
(你可能会也可能不会认为这是一件好事……)
| 归档时间: |
|
| 查看次数: |
3040 次 |
| 最近记录: |