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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |