【问题标题】:Process Scala Option type with higher-order functions处理具有高阶函数的 Scala 选项类型
【发布时间】:2020-08-18 10:37:00
【问题描述】:

有一门课

class MyType {
  def status(): String = "Connected" // demo implementation
}

我有一个val x: Option[Option[MyType]]。我需要像下面这样处理这个值:

x match {
  case None => "Error1"
  case Some(None) => "Error2"
  case Some(Some(t)) => t.status
}

我想用 Tom Morris post 中描述的高阶函数重写相同的代码。正确的编码方式是什么?


有一些关于提出问题的动机的话。官方文档says

使用scala.Option 实例最惯用的方法是将其视为集合或monad,并使用mapflatMapfilterforeach <...> 使用scala.Option 值的一种不太惯用的方法是通过模式匹配

我不太确定我是否理解 “惯用” 的确切含义,但对我来说听起来像 “好”

【问题讨论】:

  • 注意最后一个match应该是case Some(Some(t)) =&gt; t.status
  • 只是分享我的两分钱,如果您遵循@Tim 的建议,我会使用模式匹配而不是高阶函数。恕我直言,它更具可读性。
  • @Tim - 谢谢。我会修复
  • @LuisMiguelMejíaSuárez - 谢谢。我用重写 模式匹配 代码的动机扩展了这个问题
  • @Loom 而关于使用Option 作为 Monad 的短语更惯用 (意味着更常见/标准/好)真的。这也取决于上下文。也就是说,当您组合具有多个功能的多个选项时,短语更多地指代。但是,在您的情况下,您只想获得结果,我发现 模式匹配 更容易阅读。 - 但是,我可能会补充说,拥有Option[Option[X]] 通常很奇怪,也许它会是一种更惯用的方式来获得相同的最终结果。我在想也许你应该使用Either

标签: scala higher-order-functions idioms scala-option


【解决方案1】:

这样的?

x.fold("Error1")(_.fold("Error2")(_.status()))

【讨论】:

    【解决方案2】:

    map-way:

    x.map(_.map(_.status).getOrElse("Error2")).getOrElse("Error1")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 2017-01-01
      • 1970-01-01
      相关资源
      最近更新 更多