【问题标题】:Best functional way of handling conditional flows处理条件流的最佳功能方式
【发布时间】:2021-08-18 18:29:50
【问题描述】:

我有一个字符串选项,它也可能为空。我编写了以下代码来处理不同的流程分支:

input match {
   case Some(val) => {
     val match {
        case "sayHi" => "Hi"
        case "sayHello" => "Hello"
        case _ => extractFromAnotherInput
     }
   }
   None => extractFromAnotherInput
}

private def extractFromAnotherInput = {
 anotherInput match {
   case a => ....
   case b => ....
 }
}

这是用函数式语言处理代码分支的好方法还是可以用更好的方法来完成?

【问题讨论】:

  • 取决于您对 "good""better" 的含义。它还取决于您在每个分支上究竟做了什么。但总的来说,恕我直言,使用模式匹配是可以的。 - 但是,您可能需要检查更高阶的组合器,如 filtermap 以减少重复。

标签: scala functional-programming pattern-matching


【解决方案1】:

您不必嵌套匹配项:


input match {
   case Some("sayHi") => "Hi"
   case Some("sayHello") => "Hello"
   case _ => extractFromAnotherInput
}

您还可以将此输入与“另一个”组合,并在匹配之前“剥离”他的选项:

input.getOrElse(anotherInput) match {
   case "sayHi" => "Hi"
   case "sayHello" => "Hello"
   case a => ... 
   case b => ...
}

【讨论】:

  • 在第二种解决方案中,如果输入具有“sayHi”和“sayHello”以外的其他有效值,它仍然有效吗?
【解决方案2】:

我会选择 Dima 的解决方案。或者如果你想在Option上使用一些方法:

input.collect{
  case "sayHi" => "Hi"
  case "sayHello" => "Hello"
}
.getOrElse(extractAnotherInput)

【讨论】:

    【解决方案3】:

    只是因为,我想提出 Levi 答案的替代方案;只是说这更多的是见仁见智。

    input.filter(_.nonEmpty).fold(ifEmpty = extractAnotherInput) {
      case "sayHi" => "Hi"
      case "sayHello" => "Hello"
    }
    

    【讨论】:

      【解决方案4】:

      这是一个风格问题:我个人不喜欢 Option 上的模式匹配,但这是特殊的(我也可能是唯一一个通常不喜欢 for 表示法的 Scala 程序员,但这既不是这里也不是那里)。

      我会这样表达

      input.flatMap { v =>
        v match {
          case "sayHi" => Some("Hi")
          case "sayHello" => Some("Hello")
          case _ => None
        }
      }.getOrElse(extractAnotherInput)
      

      如果对这个例子过拟合(利用我可以统一变换sayHisayHello

      input.filter(v => v == "sayHi" || v == "sayHello")
        .map(_.drop(3))
        .getOrElse(extractAnotherInput)
      

      【讨论】:

      • 啊,我的心理编译器放假了 :)
      • 你也可以使用input.collect{case "sayHi" => "Hi"; case "sayHello" => "Hello"}.getOrElse(extractAnotherInput)。我发现这个更清洁,没有flatMap
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      相关资源
      最近更新 更多