Scala:简化具有比较的case语句

3

假设我有以下代码片段:

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个回答

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),则生成的future将是包含NoSuchElementExceptionFailure

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


如果我需要在可应用的Future结果的情况下执行某些操作,但不需要从函数返回一些映射的Future,则适用第一种变体。我是对的吗? - Andrii Abramov
如果我理解正确的话,是的。因为这两个变量都不会返回原始的future。 - Yuval Itzchakov

2

你不能简化case n if n>0 => ...

在模式匹配中,每个case子句都需要有一个模式和(可选的)守卫

你提到的语法(_ > 0)只适用于lambda表达式,但是在case子句中没有类似的特殊语法。


您认为在较新的Scala版本中引入这样的内容是否可能? - Andrii Abramov
我认为现在甚至没有一个建议,但我并不代表scalac团队。个人意见是,我希望从Scala中删除特殊语法,而不是添加。 - Gabriele Petronella
1
谢谢你,Gabriele。我想要的只是确保没有简化它的方法。 - Andrii Abramov
1
不确定在这个领域 Scala 是否会有重大变化,但可以看看 dotty,即 Scala 编译器的下一代:http://dotty.epfl.ch/docs/reference/changed/pattern-matching.html - Pavel
@Pavel 一般来说,关注 dotty 是个好主意,但我认为这并不涉及任何语法变更,即使是在 dotty 中也不是。 - Gabriele Petronella
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接