【问题标题】:Difference between Option handling using "for" and "match" in ScalaScala中使用“for”和“match”处理选项的区别
【发布时间】:2019-12-14 04:36:35
【问题描述】:

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

函数 divByTwo1 和 divByTwo2 将返回输入除以 2,如果输入也可以被 4 整除,否则返回 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
    }
}

【问题讨论】:

  • 第一个相当于divByFour(i).map(fourth =&gt; fourth * 4)。第二种方式等价于map的实现。所以,基本上所有三种选择都在做“相同”。 - 现在,哪个更好是一个基于意见的问题,而不是真正的技术差异。使用mapfor代替模式匹配有一个“优势”,就是代码更通用。即您可以使用任何具有相同代码的 Monad,并且语义相同,将函数应用于有效值。
  • 这确实是基于意见的,您也可以使用。取决于你的风格,以及你认为什么会增加可读性。

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


【解决方案1】:

最干净的版本大概是这样的:

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

作为一般规则,当结果为Option 时,我会使用map/flatMap/filter,因为它将计算保存在Option 容器中。当您从Option 容器中提取数据时,使用match/fold/getOrElse,结果是其他类型。

使用for 作为处理多个map/flatMap/filter 调用的便捷方式,但我个人避免使用单个map 调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2013-12-31
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多