我已经开始学习Scala很长一段时间了,我从以下两个链接上对flatMap
和flatten
进行了一些阅读。
作者采用以下代码示例
val fruits = Seq("apple", "banana", "orange")
然后在其上使用flatMap
。
fruits.flatMap(_.toUpperCase)
此外,作者说map
+ flatten
为flatMap
,下面是示例。
def toInt(s: String): Option[Int] = {
try {
Some(Integer.parseInt(s.trim))
} catch {
// catch Exception to catch null 's'
case e: Exception => None
}
}
val strings = Seq("1", "2", "foo", "3", "bar")
val mapResult = strings.map(toInt)
val flattenResult = mapResult.flatten
在这两个例子中,我对它与flatten
的区别感到困惑。让我们来看第一个例子。
fruits.flatMap(_.toUpperCase)
这也可以使用flatten
进行计算,如下所示,并导致相同的结果。
fruits.flatten(_.toUpperCase)
在第二个例子中,也可以使用flatten
,
val flattenMap = strings.flatten(x=>toInt(x))
由于flatten
也是一个接收参数的高阶函数,它与flatMap
有什么不同?
我可以看到两种方法的源代码都不同。我没有深入挖掘,因为我还没有学习协方差,反对方差,否则我就不会理解收集源代码。
任何人都可以说明一个人使用flatten
和flatMap
的具体例子吗?