You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Scala嵌套样例类传递自定义过滤谓词?

实现自定义filterLowest方法的方案

要实现你需要的自定义filterLowest方法,核心是明确谓词参数的类型为Lowest => Boolean——也就是一个接收Lowest实例、返回布尔值的函数。接下来分别给Mid和High类扩展这个方法:

给Mid类添加filterLowest

直接对Mid的lowestSeq应用filter,传入谓词即可:

case class Mid(lowestSeq: Seq[Lowest]) {
  def filterLowest(predicate: Lowest => Boolean): Seq[Lowest] = {
    lowestSeq.filter(predicate)
  }
}

给High类添加filterLowest

High包含Seq[Mid],需要先通过flatMap把所有Mid中的Lowest序列合并成一个扁平序列,再执行过滤:

case class High(midSeq: Seq[Mid]) {
  def filterLowest(predicate: Lowest => Boolean): Seq[Lowest] = {
    midSeq.flatMap(_.lowestSeq).filter(predicate)
  }
}

完整可运行代码

把所有类和测试逻辑整合起来:

case class Lowest(intVal: Int, stringVal: String)
case class Mid(lowestSeq: Seq[Lowest]) {
  def filterLowest(predicate: Lowest => Boolean): Seq[Lowest] = {
    lowestSeq.filter(predicate)
  }
}
case class High(midSeq: Seq[Mid]) {
  def filterLowest(predicate: Lowest => Boolean): Seq[Lowest] = {
    midSeq.flatMap(_.lowestSeq).filter(predicate)
  }
}

// 测试示例
object FilterTest extends App {
  val sampleLows = Seq(
    Lowest(42, "Hi"),
    Lowest(100, "Yo"),
    Lowest(42, "Yo")
  )
  val sampleMids = Seq(
    Mid(sampleLows.take(2)),
    Mid(sampleLows.drop(2))
  )
  val sampleHigh = High(sampleMids)

  // 按intVal过滤
  val allIntValsEq42 = sampleHigh.filterLowest(_.intVal == 42)
  println(allIntValsEq42) // 输出: List(Lowest(42,Hi), Lowest(42,Yo))

  // 按stringVal过滤
  val allStringValsEqYo = sampleHigh.filterLowest(_.stringVal == "Yo")
  println(allStringValsEqYo) // 输出: List(Lowest(100,Yo), Lowest(42,Yo))
}

关键说明

  • 谓词参数predicate: Lowest => Boolean可以接受任何针对Lowest的判断逻辑,比如你示例中的_.intVal == 42或_.stringVal == "Yo"这类匿名函数。
  • High类中使用flatMap而非map,是因为map会返回Seq[Seq[Lowest]],而我们需要的是一个所有符合条件的Lowest的扁平序列。

内容的提问来源于stack exchange,提问作者l Steveo l

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 20:55:03