【发布时间】:2016-11-18 23:56:03
【问题描述】:
我试图了解flatten 方法有什么魔力。这是一个示例表单this article
def toInt(s: String): Option[Int] = {
try {
Some(Integer.parseInt(s.trim))
} catch {
// catch Exception to catch null 's'
case e: Exception => None
}
}
scala> val strings = Seq("1", "2", "foo", "3", "bar")
strings: Seq[java.lang.String] = List(1, 2, foo, 3, bar)
scala> strings.map(toInt)
res0: Seq[Option[Int]] = List(Some(1), Some(2), None, Some(3), None)
scala> val flattenResult = mapResult.flatten
flattenResult: Seq[Int] = List(1, 2, 3)
哇。它看起来像一些奇迹。 flatten 方法如何知道我们不应该将Nones 添加到结果集合中。它的实现方式并不明显:
def flatten[B](implicit asTraversable: A => /*<:<!!!*/ GenTraversableOnce[B]): CC[B] = {
val b = genericBuilder[B]
for (xs <- sequential)
b ++= asTraversable(xs).seq
b.result()
}
你能不能解释一下它的含义...我的意思是它一般有什么作用?也许它确实知道,None 是一个 monadic 值,并使用它的一些“monadic”方法。但这只是猜测。
【问题讨论】:
标签: scala collections flatten