首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FP:如何过滤List[A],这样它将包含除Option[A]之外的所有元素

FP:如何过滤List[A],这样它将包含除Option[A]之外的所有元素
EN

Stack Overflow用户
提问于 2017-07-21 00:46:13
回答 5查看 72关注 0票数 0

这是更有教育意义的答案,因为我有工作解决方案,但我觉得应该有一些函数式编程模式或概念,我错过了,我想学习它。

假设我有一个List[Player],其中Player是case类。另外,我有Option[Player],并且我想写一个方法,它将返回列表中的所有元素,除了一个元素(可能!)包含在Option中。以下是代码

代码语言:javascript
复制
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(_))?谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-07-21 00:56:17

如果没有老板的名字,你就不需要搜索这个列表,所以把搜索去掉。

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2017-07-21 00:58:03

首先,您不应该在functional中使用var。我会这样做:

代码语言:javascript
复制
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)

这还将允许您执行以下操作:

代码语言:javascript
复制
def filterForSpecificBoss = findAllException(boss)
val filtered = filterForSpecificBoss(players)
票数 1
EN

Stack Overflow用户

发布于 2017-07-21 01:02:54

我经常发现fold()是一个方便的Option解包器。

代码语言:javascript
复制
boss.fold(players)(b => players.filterNot(_.id == b.id))

这样,如果不需要的话,您就不需要遍历players了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45220700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档