这似乎是一个小问题,因为有一个简单的解决方法,但是这两个表达式之间有什么区别?
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/