scala - Scala 匿名函数中这两个表达式有什么区别?

标签 scala anonymous-function

这似乎是一个小问题,因为有一个简单的解决方法,但是这两个表达式之间有什么区别?

List(1, 2, 3).sortBy(_)
List(1, 2, 3).sortBy(x => x)

第一个获得编译器诊断

missing parameter type for expanded function ((x$1) => List(1, 2, 3).sortBy(x$1))

第二个被视为语法有效。

谢谢。

最佳答案

第二个更简单,它只是一个身份函数,可以轻松地用 identity 替换:

List(1, 2, 3).sortBy(x => x)

您基本上是要求 Scala 从列表中获取一个元素,对其应用函数 f 并使用此结果对列表进行排序。它具有以下签名:

def sortBy[B](f: (A) ⇒ B)(implicit ord: math.Ordering[B]): List[A]

第一个是 lambda(匿名)函数的语法糖。在您的示例中,由于脱糖规则,它不起作用,它解析为 closes 封闭范围,这写在错误消息中:

((x$1) => List(1, 2, 3).sortBy(x$1))

要完成这项工作,您可以这样做:

def f[T](a: T) = a

List(1, 2, 3).sortBy(f(_))

这不会引发编译错误,因为编译会将其脱糖为:

List(1, 2, 3).sortBy((x$1) => f(x$1))

或者你可以直接写

List(1, 2, 3).sortBy(identity)

其中身份与f函数相同,它是defined在 Predef.scala 中

关于scala - Scala 匿名函数中这两个表达式有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21464932/

相关文章:

Scala:未指定的值参数证据$3

javascript - 匿名自调用 JavaScript 函数 - 返回多个对象

javascript - JQuery中点击按钮后如何返回函数的值?

scala - 如何使用 spark 流读取 .csv 文件并使用 Scala 写入 parquet 文件?

java - 如何在 Java 中编写匿名函数?

c# - LINQ 扩展委托(delegate)

javascript - 在方法内部执行方法

Scala测试错误: value/is not a member of sbt.配置

scala - 如何实现 future 组合

java - 公共(public) Scala 构造函数字段在 Java 中不是公共(public)的