Scala:通过比较简化案例

Scala: simplify case with comparison

比方说,我有以下代码片段:

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

能否以某种方式简化此代码?

如果想简化守卫,可以过滤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 包含 NoSuchElementException.

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

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

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

您提到的语法 (_ > 0) 仅在 lambda 中有效,但 case 子句没有类似的特殊语法。