势在必行与功能的例子

Sot*_*ric 4 functional-programming scala imperative-programming

我有一个方法实现在命令式和功能性(我在这里尽我所能)的方式.该方法迭代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
}
Run Code Online (Sandbox Code Playgroud)

功能:

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)
  }
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

dre*_*xin 8

你可以使用collect来简化这个:

game.creatures collect { case creature if creature != this => (creature, distanceTo(creature)) }
Run Code Online (Sandbox Code Playgroud)

collect采用a PartialFunction并且只返回定义此函数的值,因此creature == this不会返回.

而你也可以替换

case creaturesWithDistance if creaturesWithDistance.isEmpty => None
Run Code Online (Sandbox Code Playgroud)

case Seq() => None
Run Code Online (Sandbox Code Playgroud)