如何解决SAM和匿名函数之间的区别
我最近偶然发现了Java中的SAM(单一抽象方法)概念。
我在Scala中编程,对我来说,它们看起来与匿名函数(或lambda)相同,但是我的IntelliJ建议我在不同的情况下使用SAM或lambda。
示例1:
val x = new Function1[Int,Int] { // here usage of lambda is suggested
override def apply(x: Int): Int = x * 2
}
建议在这里使用lambda。
示例2:
val event: EventHandler[ActionEvent] = new EventHandler[ActionEvent]() { // here usage of SAM is suggested
override def handle(e: ActionEvent): Unit = {
println("hi")
}
}
我很难看到匿名函数和SAM之间的语法差异。两者之间在概念上或功能上有什么区别吗?
解决方法
FunctionN类型在scala中是特殊的,因为匿名函数会自动推断为该类型。除非期望的类型是(不同的)SAM接口,否则推断val twice = (x: Int) => x * 2
是Function1[Int,Int]
,而不是任何其他类型。
如果期望的类型是SAM接口(具有单个抽象方法的接口),它将转换为该类型。
,语法几乎相同,不同之处在于上下文。
Function是语言支持的接口,它允许将2个功能组合为一个功能,由集合等功能支持。
单一抽象方法是只有一种方法可以实现的任何特征或类,因此采用该方法的签名,将其转换为函数的签名,然后让编译器将该函数重写为匿名类实例,这将是明确的。 / p>
明显的区别:
- 仅当您提供明显使其不想在其中具有函数的类型时,compiler才能将函数重写为SAM
- SAM不会扩展功能界面,因此您将无法执行例如
sam1 andThen sam2
,除非您自己以某种方式在其中添加这些方法 - 您不能只接受某些东西返回的函数并将其用作SAM-必须使用函数语法初始化SAM对象(在创建该对象的地方)
我想您可以将它们视为同一个概念-具有某些特征/类,而该特征/类仅具有使用函数语法初始化的一种抽象方法-其中某些FunctionX
接口将是“默认”接口,而编译器将它,以及其他一些实现将需要显式类型说明,并称为SAM。
我们是否将SAM视为函数语法的重用,或者将函数视为SAM的特例,都不会改变SAM不是lambdas / closures / anonymous函数的事实。此名称仅用于打算用作功能的事物,即功能接口的实现(Function1
,Function2
,...,PartialFunction
等)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。