Scala FP:如何筛选列表[A],这样它将包含除选项[A]之外的所有元素
这是一个更具教育意义的答案,因为我有工作解决方案,但我觉得应该有一些我错过的函数式编程模式或概念,我想学习它 假设我有一个Scala FP:如何筛选列表[A],这样它将包含除选项[A]之外的所有元素,scala,Scala,这是一个更具教育意义的答案,因为我有工作解决方案,但我觉得应该有一些我错过的函数式编程模式或概念,我想学习它 假设我有一个列表[Player],其中Player是case类。我还有选项[Player],我想写一个方法,该方法将返回列表中的所有元素,除了选项中包含的元素(可能!)。这是密码 case class Player(id:Long) val players = List(Player(1), Player(2), Player(3)) var boss = None def findAl
列表[Player]
,其中Player
是case类。我还有选项[Player]
,我想写一个方法,该方法将返回列表中的所有元素,除了选项中包含的元素(可能!)。这是密码
case class Player(id:Long)
val players = List(Player(1), Player(2), Player(3))
var boss = None
def findAllExceptBoss = {
players.filter(boss != Some(_))
}
findAllExceptBoss.size should be (3)
var boss = Some(Player(1))
findAllExceptBoss.size should be (2)
所以,我的问题是-如何以更实用的风格实现players.filter(boss!=Some()))
?
谢谢 如果老板没有名字,你不需要搜索列表,所以要考虑搜索
case class Player(id:Long)
val players = List(Player(1), Player(2), Player(3))
var boss: Option[Player] = None
def findAllExceptBoss = {
boss match {
case Some(b) => players.filter(b != _)
case None => players
}
}
findAllExceptBoss.size should be (3)
boss = Some(Player(1))
findAllExceptBoss.size should be (2)
首先,你不应该在函数中有一个var。我会这样做:
def findAllExceptBoss(boss: Option[Player])(players: List[Player]): List[Player] = {
boss.map(b => players.filter(p => p != b).getOrElse(players)
}
findAllExceptBoss(None)(players).size should be (3)
def filterForSpecificBoss = findAllException(boss)
val filtered = filterForSpecificBoss(players)
这也将允许您执行以下操作:
def findAllExceptBoss(boss: Option[Player])(players: List[Player]): List[Player] = {
boss.map(b => players.filter(p => p != b).getOrElse(players)
}
findAllExceptBoss(None)(players).size should be (3)
def filterForSpecificBoss = findAllException(boss)
val filtered = filterForSpecificBoss(players)
关于您的方法定义,我认为:
def findAllExceptBoss=
for {
p <- players
b <- boss
if p != b
} yield p
def findAllExceptBoss=
对于{
p我经常发现fold()
是一个方便的选项
展开器
boss.fold(players)(b => players.filterNot(_.id == b.id))
这样,如果不必遍历播放器,您就不必遍历。正确的方法是播放器.filterNot(boss.toSet)
另外,不要使用var
s,它们是不好的。谢谢,这是有意义的。很好的优化是的,我怎么能忘记理解:)但是为了不遍历完整的列表bs,幸运的是我需要将boss作为“var”,因为它可以在游戏中更改。我知道State Monad,但我还没有尝试,因为我需要更多的基本ScalaThanks、Bob和其他人的经验。有很多很酷的建议,但我认为即使是新手,这也是最简洁易懂的,所以我会接受它。