在Scala中{flat}和flatten之间的差异

时间:2017-11-28 17:47:20

标签: scala functional-programming

我已经开始学习Scala很长一段时间了,我从以下两个链接上对flatMapflatten进行了一些阅读。

作者采用以下代码示例

 val fruits = Seq("apple", "banana", "orange")

然后在其上使用flatMap

fruits.flatMap(_.toUpperCase)

此外,作者说map + flattenflatMap,下面是示例。

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有什么不同?

我可以看到两种方法的源代码都不同。我没有深入挖掘,因为我还没有学习协方差,反对方差,否则我就不会理解收集源代码。

任何人都可以说明一个人使用flattenflatMap的具体例子吗?

0 个答案:

没有答案