假设我的数据有这种层次结构:

sealed trait Foolike
case class Foo extends Foolike
case class Bar extends Foolike
case class Baz extends Foolike

现在我想创建一个 API,您可以在其中放入任何这些参数,如下所示:
def apiMethod(modifiers: Foolike*) = {


  val foos = modifiers
    .filter(_.isInstanceOf[Foo])
    .map(_.asInstanceOf[Foo])

  val bars = modifiers
    .filter(_.isInstanceOf[Bar])
    .map(_.asInstanceOf[Bar])

}

有没有更好的方法从 Foo 中提取所有 Bar 和所有 modifiers

最佳答案

def apiMethod(modifiers: Foolike*) = {

    @tailrec
    def foosAndBarsAndBazs(mods: List[Foolike], foos: List[Foo], bars: List[Bar], bazs: List[Baz]): (List[Foo], List[Bar], List[Baz]) = mods match {
        case Nil => (foos, bars, bazs)
        case (foo: Foo) :: tail => foosAndBarsAndBazs(tail, foo :: foos, bars, bazs)
        case (bar: Bar) :: tail => foosAndBarsAndBazs(tail, foos, bar :: bars, bazs)
        case (baz: Baz) :: tail => foosAndBarsAndBazs(tail, foos, bars, baz :: bazs)
    }

    val (foos, bars, bazs) = foosAndBarsAndBazs(modifiers.toList, Nil, Nil, Nil)
}

这是尾递归解决方案。当然,你可以只在修饰符和模式匹配上使用 map 来获得一个 Option 元组,然后将它们展平,但是你会再次遍历每个列表......

关于scala - 如何将父类(super class)型的 Seq 分成子类型的 Seq,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38969031/

10-10 16:57