加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala类型检查抱怨lambda,而不是显式函数

发布时间:2020-12-16 18:13:52 所属栏目:安全 来源:网络整理
导读:我有以下 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
我有以下 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替换该函数(that’s what I understand from the doc,at least,并且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)

(在我看来,第一种选择应该匹配.)

I’ve just asked a similar question,解决方案是明确指定类型参数,但在这种情况下,我想我已经指定了我能做的一切.是否有另一种使用lambda的解决方案,或者是否需要显式函数?如果是后者,是否有一个文档解释了什么时候lambda可以替代SAM?

解决方法

TL; DR:使用 Ordering而不是直接使用Comparator.

您可以使用类型归属强制它将您的参数识别为java.util.function.Function [Int,String]:

Comparator.comparing[Int,String]((_.toString) : function.Function[Int,String])

请注意,_.toString周围的括号是必需的;否则,它会尝试将ascription应用于lambda中的表达式而不是lambda作为整体.此代码基本上等同于:

val tmp: function.Function[Int,String] = _.toString
Comparator.comparing[Int,String](tmp)

但是,在编写Scala时,通常最好使用Ordering.由于Ordering扩展了Comparator,它可以在预期的比较器的任何地方使用.您可以使用它:

val cmp: Comparator[Int] = Ordering.by(_.toString)

要么:

val cmp = Ordering.by[Int,String](_.toString)

正如您所看到的,类型推断在这里工作得更好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读