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开始时你有这样的疑虑吗?经过一段时间后,您的功能技能是否得到了极大的改善,并完全击败了强制性方法 请发布您的经验.
谢谢!
你可以使用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)
| 归档时间: |
|
| 查看次数: |
827 次 |
| 最近记录: |