在Scala中使用“ for”和“ match”进行选项处理之间的区别

时间:2019-08-06 15:15:50

标签: scala functional-programming pattern-matching monads optional

我目前正在学习Scala,遇到了两种处理选项的方法。结果是相同的,但我想知道使用一个相对于另一个是否有优势(或者是否有更好的选择)。

如果输入也可以除以4,则divByTwo1和divByTwo2函数将返回输入除以2,否则返回None。

def divByFour(i: Int): Option[Int] = {
    if (i % 4 == 0) {
        Some(i / 4)
    } else {
        None
    }
}

def divByTwo1(i: Int): Option[Int] = {
    for {
        fourth <- divByFour(i)
    } yield fourth * 2
}

def divByTwo2(i: Int): Option[Int] = {
    divByFour(i) match {
        case Some(fourth) => Some(fourth * 2)
        case None         => None
    }
}

1 个答案:

答案 0 :(得分:6)

最干净的版本可能是这样:

def divByTwo(i: Int): Option[Int] = divByFour(i).map(_ * 2)

通常,我将在结果为map时使用flatMap / filter / Option,因为它将计算保留在Option内容器。从match容器中提取数据时使用fold / getOrElse / Option,结果是其他类型。

使用for作为处理多个map / flatMap / filter呼叫的便捷方法,但我个人避免在单个map呼叫中使用它。 / p>