如何利用Scala的for循环过滤掉None的值
发布网友
发布时间:2022-04-30 15:34
我来回答
共1个回答
热心网友
时间:2022-06-26 11:03
看到这段代码的第一感觉是,这也能编译过?(Monad:我有一句话不知当讲不当讲)
这个可以扒掉语法糖看一下:
scala> val dogBreeds = Some("a") :: None :: Some("b") :: None :: Some("c") ::
Nil
dogBreeds: List[Option[String]] = List(Some(a), None, Some(b), None, Some(c))
scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> reify {
| for {
| breedOption <- dogBreeds
| breed <- breedOption
| } yield breed
| }
res0: reflect.runtime.universe.Expr[List[String]] = Expr[List[java.lang.String]]
($read.dogBreeds.flatMap(((breedOption) => Option.option2Iterable(breedOption.ma
p(((breed) => breed)))))(List.canBuildFrom))
看到调用了Option.option2Iterable:
implicit def option2Iterable[A](xo: Option[A]): Iterable[A] = xo.toList
它调用了Option的toList方法,所以Option变成List了,在这做的过滤:
def toList: List[A] =
if (isEmpty) List() else new ::(this.get, Nil)
-------------------------------
等价于:
for {
breedOption <- dogBreeds
breed <- breedOption.toList
} yield breed