gpt4 book ai didi

scala - SAM 和匿名函数的区别

转载 作者:行者123 更新时间:2023-12-03 20:04:17 24 4
gpt4 key购买 nike

我最近偶然发现了 Java 中的 SAM(单一抽象方法)概念。
我在 Scala 中编程,对我来说,它们看起来与匿名函数(或 lambdas)相同,但是我的 IntelliJ 建议我在不同的场景中使用 SAM 或 lambdas。
示例 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 之间的语法差异。两者之间是否存在任何概念或功能差异?

最佳答案

语法几乎相同,区别在于上下文。
函数是语言支持的接口(interface),它允许将 2 个函数组合为一个函数,由集合支持等。
单个抽象方法是任何只有一个方法要实现的特征或类,因此可以明确地获取该方法的签名,将其转换为函数的签名,然后让编译器将此类函数重写为匿名类实例。
显着差异:

  • 编译器只有在您提供的类型表明您不想在其中使用函数时才能将函数重写为 SAM
  • SAM 不会扩展功能接口(interface),因此您将无法执行例如sam1 andThen sam2除非你以某种方式自己添加这些方法
  • 您不能只获取某物返回的函数并将其用作 SAM - 必须使用函数语法来初始化 SAM 对象,在原地创建它

  • 我想您可以将它们视为相同的概念-某些特征/类具有使用函数语法初始化的恰好一个抽象方法-其中一些 FunctionX接口(interface)将是“默认”,编译器将对其进行交互,而其他一些实现将需要显式类型归属并称为 SAM。
    无论我们将 SAM 视为函数语法的重用,还是将函数视为 SAM 的特殊情况,都不会改变 SAM 不是 lambdas/closures/匿名函数的事实。此名称仅用于旨在用作函数的事物,即函数接口(interface)的实现( Function1Function2、...、 PartialFunction 等)。

    关于scala - SAM 和匿名函数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63483827/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com