在scala中运行时将遍历转换为另一个

Mik*_*yer 1 scala yield-keyword

我希望能够通过A遍历的所有B.我尝试了以下代码:

object Test {
  class A
  class B extends A
  class C extends A
  var someAs: Traversable[A] = ...
  def theBofSomeAs: Traversable[B] = for(a <- someAs) {
    a match {
      case b:B => yield b
      case _ =>
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是这不会编译,因为它表示表达式具有类型Unit.怎么实现呢?

om-*_*nom 5

编译器认为返回类型是Unit,因为如果你不去B,你就什么都不返回.

使用collect,更容易阅读:

def theBofSomeAs: Traversable[B] = someAs.collect { case b: B => b }
Run Code Online (Sandbox Code Playgroud)