处理条件流程的最佳功能方式

Best functional way of handling conditional flows

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

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 => ....
 }
}

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

这是一个风格问题:我个人不喜欢 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)

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

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

您不必嵌套匹配:


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 => ...
}

我会选择 Dima 的解决方案。或者,如果您想在 Option 上使用某种方法:

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