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

scala – 势在必行与功能性

发布时间:2020-12-16 18:22:09 所属栏目:安全 来源:网络整理
导读:我有一个方法实现在命令式和功能性(我在这里尽我所能)的方式.该方法迭代ArrayBuffer [生物],计算每个生物的距离并返回最近或无(如果世界上没有生物,除了’this’). 势在必行: private def closestEnemy: Option[Creature] = { var closest: Option[Creature
我有一个方法实现在命令式和功能性(我在这里尽我所能)的方式.该方法迭代ArrayBuffer [生物],计算每个生物的距离并返回最近或无(如果世界上没有生物,除了’this’).

势在必行:

private def closestEnemy: Option[Creature] = {
  var closest: Option[Creature] = None
  var distanceToClosest = Int.MaxValue

  for(creature <- game.creatures if creature != this) {
    val distance = distanceTo(creature)

    if(distance < distanceToClosest) {
      closest = Some(creature)
      distanceToClosest = distance
    }
  }

  closest
}

功能:

private def closestEnemy: Option[Creature] =
  game.creatures filter { _ != this } map { creature => (creature,distanceTo(creature)) } match {
    case creaturesWithDistance if creaturesWithDistance.isEmpty => None
    case creaturesWithDistance => Some(creaturesWithDistance minBy { _._2 } _1)
  }

功能代码看起来不太明显(可能它可以简化,但我不知道如何),我不确定我能否在一个月内在飞行中阅读它.我的问题是这个特殊情况是习惯问题还是功能问题? Scala开始时你有这样的疑虑吗?经过一段时间后,您的功能技能是否得到了极大的改善,并完全击败了强制性方法请发布您的经验.

谢谢!

解决方法

如果您的主要目标是可读性,则以下内容提供与您的代码相同的输出:

private def closestEnemy =
  game.creatures.filterNot(_ == this).sortBy(distanceTo).headOption

这对我来说非常清楚 – 语法噪音很小,特别是与你的命令版本相比.

不幸的是sortBy比minBy更昂贵,更不幸的是Scala Collections API中没有“安全”的minBy(其中“safe”意味着它返回一个在空列表中调用时为空的Option).但以下情况并不太可怕:

private def closestEnemy = game.creatures.filterNot(_ == this) match {
  case creatures if creatures.nonEmpty => Some(creatures.minBy(distanceTo))
  case _ => None
}

所以在这种情况下你遇到了Collections API的合法缺点(没有safeMinBy),但我个人更喜欢维护这个代码而不是命令式版本.

作为脚注:值得注意的是,您可以使用pimp-my-library pattern“修复”Collections API.只需将以下内容放在范围内:

implicit def makeSeqSafer[A](xs: Seq[A]) = new {
  def safeMinBy[B: Ordering](f: A => B) =
    if (xs.isEmpty) None else Some(xs.minBy(f))
}

现在你有一个安全,高效的minBy:

scala> List(1,2,3).safeMinBy(_ * 2)
res0: Option[Int] = Some(1)

scala> List.empty[Int].safeMinBy(_ * 2)
res1: Option[Int] = None

在你的情况下:

private def closestEnemy =
  game.creatures.filterNot(_ == this).safeMinBy(distanceTo)

(编辑:李大同)

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

    推荐文章
      热点阅读