使用forall代替列表上的过滤器[a]



正在尝试确定是否在每周游戏结果报告中显示加班游戏显示标志。

数据库游戏结果表具有3列(P4,P5,P6),这些列代表潜在的加班游戏时间分数总数(分别为OT,Double OT和Triple OT)。这些列映射到应用程序层中的选项[int]。

目前,我正在通过游戏结果Teama,TeamB对进行过滤,但实际上我只想知道是否存在任何类型的游戏(vs.在集合中踏上)。

def overtimeDisplay(a: GameResult, b: GameResult) = {
  val isOT = !(List(a,b).filter(_.p4.isDefined).filter(_.p5.isDefined).filter(_.p6.isDefined).isEmpty)
  if(isOT) {
    <b class="b red">
    {List( ((a.p4,a.p5,a.p6),(b.p4,b.p5,b.p6)) ).zipWithIndex.map{
      case( ((Some(_),None,None), (Some(_),None,None)), i)=> "OT"
      case( ((Some(_),Some(_),None), (Some(_),Some(_),None )), i)=> "Double OT"
      case( ((Some(_),Some(_),Some(_)), (Some(_),Some(_),Some(_) )), i)=> "Triple OT"
    }}
    </b>
  }
  else scala.xml.NodeSeq.Empty
}

其次,确定要显示哪种类型的加班时间,当前繁忙的模式匹配(现在看着它看起来并未涵盖所有评分场景),可能以更有功能/简洁的方式来完成。

如果您有更好的方法,请随时放下它。

谢谢

不确定我是否正确理解初始代码,但这是一个想法:

val results = List(a, b).map(r => Seq(r.p4, r.p5, r.p6).flatten)
val isOT = results.exists(_.nonEmpty)
val labels = IndexedSeq("", "Double ", "Triple ")
results.map(p => labels(p.size - 1) + "OT")

在第一行中将得分列转换为平面列表至关重要。您有GameResult(p4: Option[Int], p5: Option[Int], p6: Option[Int]),您可以将其映射到Seq[Option[Int]]r => Seq(r.p4, r.p5, r.p6),然后将其弄平以将Some[Int]转换为Int并删除None。这将把Some(42), None, None变成Seq(42)

看着这一点:

val isOT = !(List(a,b).filter(_.p4.isDefined).filter(_.p5.isDefined).filter(_.p6.isDefined).isEmpty)

可以使用exists而不是filter重写。我会将其重写如下:

List(a, b).exists(x => x.p4.isDefined && x.p5.isDefined && x.p6.isDefined)

除了使用exists外,我还将将您传递给过滤器的三个条件组合到一个匿名函数中。

此外,我不知道为什么您似乎不使用map功能中的索引时使用zipWithIndex。它可以完全删除。

最新更新