Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala FP:如何筛选列表[A],这样它将包含除选项[A]之外的所有元素_Scala - Fatal编程技术网

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,它们是不好的。

谢谢,这是有意义的。很好的优化是的,我怎么能忘记理解:)但是为了不遍历完整的列表b
s,幸运的是我需要将boss作为“var”,因为它可以在游戏中更改。我知道State Monad,但我还没有尝试,因为我需要更多的基本ScalaThanks、Bob和其他人的经验。有很多很酷的建议,但我认为即使是新手,这也是最简洁易懂的,所以我会接受它。