Scala:通过比较简化案例

时间:2017-10-05 12:51:58

标签: scala pattern-matching code-cleanup

让我们说,我有以下代码片段:

val num = Future.successful(10)

num map {
  case n if n > 0 => // do something
  case _             // do something
}

我的问题是:我能以某种方式简化case n if n > 0吗?

我希望我能写出类似的内容:

case _ > 0 => // do something

或使用明确指定的类型(尽管我们知道Future已推断类型[Int]):

case _: Int > 0 => // do something

这段代码能以某种方式简化吗?

2 个答案:

答案 0 :(得分:2)

如果您想简化保护,可以过滤Future先验:

val num = Future.successful(10).filter(_ > 0).map { nat =>
}

否则,你可以保持警惕并使用Future.collect

val num = Future.successful(10).collect {
    case n if n > 0 => // do something
}

需要注意的一件重要事情是,如果没有为返回的值定义部分函数(例如,对于您的情况-1),则生成的未来将是包含Failure的{​​{1}}。

除了这些选项,你还需要警卫。我没有看到任何语法上更短的表达方式。

答案 1 :(得分:2)

您无法简化case n if n > 0 => ...

模式匹配中的每个case子句都需要具有模式和(可选) guard

您所引用的语法(_ > 0)仅在lambdas中有效,但对于case子句没有类似的特殊语法。