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

Scala,部分功能

发布时间:2020-12-16 08:58:38 所属栏目:安全 来源:网络整理
导读:除了通过case语句之外,有没有办法创建PartialFunction? 我很好奇,因为我想表达以下内容(scala pseudo ahead!)… val bi = BigInt(_)if (bi.isValidInt) bi.intValue ……作为一个部分功能,并做 val toInt : PartialFunction[String,Int] = { case s if Big
除了通过case语句之外,有没有办法创建PartialFunction?

我很好奇,因为我想表达以下内容(scala pseudo ahead!)…

val bi = BigInt(_)
if (bi.isValidInt) bi.intValue

……作为一个部分功能,并做

val toInt : PartialFunction[String,Int] = {
    case s if BigInt(s).isValidInt => BigInt(s).intValue
}

因为我创建BigInt两次似乎是多余的.

解决方法

我不确定我理解这个问题.但这是我的尝试:为什么不创建一个提取器?

object ValidBigInt {
  def unapply(s: String): Option[Int] = {
    val bi = BigInt(s)
    if (bi.isValidInt) Some(bi.intValue) else None
  }
}

val toInt: PartialFunction[String,Int] = {
  case ValidBigInt(i) => i
}

另一个选项是(并且可以回答关于是否可以创建除了案例文字之外的PartialFunction的问题):

val toInt = new PartialFunction[String,Int] {
  def isDefinedAt(s: String) = BigInt(s).isValidInt
  def apply(s: String) = BigInt(s).intValue
}

然而,由于部分函数的想法是它只是部分定义,最终你仍然会做多余的事情 – 你需要创建一个大的int来测试它是否有效,然后在函数应用程序中创建大的int再次…

我在Github看到一个项目试图通过稍微缓存isDefinedAt的结果来解决这个问题.如果你进入基准测试,你会发现它比默认的Scala实现要慢:)

因此,如果你想要绕过isDefinedAt与apply的双重性质,你应该直接寻找一个提供Option [Int]作为结果的(完整)函数.

(编辑:李大同)

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

    推荐文章
      热点阅读