我有以下Scala代码:
import java.util.{Comparator, function}
object ComparatorTest {
Comparator.comparing[Int, String](new function.Function[Int, String] {
override def apply(t: Int): String = t.toString
})
}
这段代码没有问题。根据文档,我认为我应该能够用lambda表达式替换掉Function
(至少我是这样理解的,而且IntelliJ也是这个意见)。但是,当我替换它时,出现了问题。
Comparator.comparing[Int, String]((t: Int) ⇒ t.toString)
我遇到了编译器错误:
Error:(6, 23) overloaded method value comparing with alternatives:
(x$1: java.util.function.Function[_ >: Int, _ <: String])java.util.Comparator[Int] <and>
(x$1: java.util.function.Function[_ >: Int, _ <: String],x$2: java.util.Comparator[_ >: String])java.util.Comparator[Int]
cannot be applied to (Int => String)
Comparator.comparing[Int, String]((t: Int) ⇒ t.toString)
我认为第一个选项应该匹配。 我刚刚提出了一个类似的问题,解决方案是显式指定类型参数,但在这种情况下,我认为我已经指定了我可以指定的所有内容。是否有另一种方法来使用lambda,或者需要显式的
Function
?如果是后者,是否有文档解释何时可以将lambda替换为SAM?
Ordering.by(user => (user.lastName, user.firstName))
用于Ordering.by(_.lastName).orElseBy(_.firstName)
(尽管我承认它不太易读)。 - Brian McCutchon