如何为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
相关产品推荐
相关产品推荐

