当前位置: 首页 > 知识库问答 >
问题:

为什么我可以使用lambda表达式的名称,但不能使用函数的名称?[重复]

池照
2023-03-14

我可以用“小”函数定义“大”函数:

fun apply3(a:Int, b:Int, c:Int, func: (Int,Int,Int)->Int ): Int{
    return func(a,b,c)
}

我可以这么说:

println(apply3(1,2,3,{a,b,c->a+b+c}))

另一方面,如果我想多次使用同一个函数并为其使用名称,我就会遇到问题:

val plus1: (Int,Int,Int)->Int = {a,b,c->a+b+c}  //this is OK
...
fun plus2(a:Int, b:Int, c:Int)=a+b+c    // this too
...
println(apply3(1,2,3,plus1))    // this is allowed
...
println(apply3(1,2,3,plus2))    // this is NOT allowed

最后一行是禁止的。留言:

Type mismatch
Required: (Int,Int,Int)->Int
Found: Int

为什么?对我来说,plus2和plus2是一样的东西?

这篇文章有一个答案,建议在我的例子中使用::plus2。这在技术上有帮助,但不能解释这两种功能之间的区别。

共有1个答案

潘弘博
2023-03-14

您需要使用函数引用:

println(apply3(1,2,3,::plus2))
 类似资料:
  • 问题内容: 我想创建一个名为“ new”的函数和一个名为“ case”的类。 我可以用PHP做到吗? 问题答案: 不,你 不能。感谢上帝。

  • 问题内容: 我们可以通过两种不同的方式在JavaScript中执行函数表达式: 命名函数表达式(NFE) : 匿名函数表达式 : 而且两个都可以用调用。我真的看不到为什么/何时应该使用匿名函数以及何时应该使用命名函数表达式。他们之间有什么区别? 问题答案: 对于匿名函数表达式,该函数是匿名的从字面上看,它没有名称。您要为其分配变量的变量具有名称,但是该函数没有。 _(更新:这在ES5中是正确的。从

  • 问题内容: 刚刚开始探索正则表达式的“奇迹”。作为一个从试验和错误中学习的人,我真的很努力,因为我的试验抛出了不成比例的错误……我的实验是在PHP中使用ereg()进行的。 无论如何。我分别使用名字和姓氏,但现在使用相同的正则表达式。到目前为止,我有: 任何以大写字母开头且其余仅包含字母(大写或不大写)的长度字符串。但是我分崩离析的地方是在几乎任何地方都可能发生的特殊情况下。 连字符(Worthi

  • 问题内容: 我在Java 8映射操作中传递了一个Function,Intellij告诉我可以将其替换为lambda表达式。但是我不知道如何在不创建中间对象结构的情况下做到这一点。 这是我的工作: 我认为Intellij建议我这样做: 我不知道一种干净的方法来获取在匿名函数中检索到的objectType.getTempUrl()。getFullUrl()部分,有什么建议吗? 问题答案: 你总是可以写

  • 我正在使用部署我的应用程序。 我正在尝试对和嵌入式数据库运行此操作。 的配置如下所示 当我使用cargo运行集成测试时,我看到了两个区别, 当对运行时,会注意模式名称当Liquibase运行时,我会看到test_common test_common.databasechangelog信息5/26/14 9:18 am:LiquiBase:LiquiBase/Changelog.xml:LiquiB

  • 问题内容: 在Java中,变量名以字母,货币字符()等开头,但不以数字、、或 一个简单的问题:那是为什么? 为什么编译器不允许有变量声明,例如 问题答案: 因为Java语言规范是这样说的: 标识符字符: JavaLetter {JavaLetterOrDigit} 所以-是的,标识符必须以字母开头;它不能以数字开头。 其背后的主要原因是: 这就是大多数人所期望的 当您限制标识符的“布局”时,它使