【问题标题】:Scala for-comprehension with Options带有选项的 Scala 理解
【发布时间】:2021-08-10 12:54:48
【问题描述】:

我有 2 个 Scala 选项,我需要将它们组合在一起以进行进一步处理。其中之一可以是无。

我将理解用作:

val first: Option[Int] = Some(2)
val second: Option[Int] = Some(3) 
val result: Option[String] =  for {
          f <- first
          s <- second
        } yield {
          s"Inputs are $f and $s "
        }

但如果其中一个选项是无,Scala 将跳过 yield 块。即使没有,我也希望执行 yield。如何做呢?也许我可以在 for 块中放置一些过滤器,将原始 None 转换为一些非 None 值。

所以基本上可以做到:

val result: Option[String] =  for {
              f <- first
              s <- second.isDefined else Some(-1)
            } yield {
              // my logic
            }

【问题讨论】:

  • 您可能希望在两个选项上都使用模式匹配或仅使用getOrElse,而不是使用for

标签: scala


【解决方案1】:

这取决于您要在 None 值的情况下应用的逻辑。

我看到了两种可能性:

使用默认值

for {
  f <- first
  s <- second.orElse(Some(-1)) // default value -1
} yield {
  s"Inputs are $f and $s "
}

如果您想在 None 值的情况下应用类似的逻辑,这很有效。

使用模式匹配

(first, second) match {
  case (Some(f), Some(s)) => ...
  case (Some(f), None) => ...
  case (None, Some(s)) => ...
  case (None, None) => ...
}

这对于 None 的不同行为更有效,但如果您有超过 2 个 Options,这不会很好地“扩展”。

【讨论】:

    【解决方案2】:
       first.foreach { f => println(s"Inputs are $f and ${second.getOrElse(-1)}") }
    

    【讨论】:

      【解决方案3】:

      如果你想同时执行这两个选项,我认为你可以这样做。

          val firstResult = first match {
            case Some(value) => value
            case _           => -1
          }
          val secondResult = second match {
            case Some(value) => value
            case _           => -1
      
          }
         Some(s"Inputs are $firstResult and $secondResult ")
      

      【讨论】:

      • 这种模式匹配很容易替换为getOrElse
      • @GaëlJ 是的,如果您不必对值应用某些操作,您可以这样做
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 2020-03-12
      • 2021-11-21
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多