假设我有一个方法 foo
作为:
def foo(i:Int):Option[Int] = ??? // some code
现在我想对 Int
的 Seq
进行如下操作:
Seq(1, 2).map{
case int => foo(int)
}.collect{
case Some(int) => int
}
将其结合起来的一种方法是:
Seq(1, 2).collect{
case int if foo(int).isDefined => foo(int)
}
有什么方法可以避免调用 foo
两次?
所以基本上我希望 foo(int)
在 =>
的 LHS 上定义为准备好在 RHS 上使用的变量,而不必再次计算它.
最佳答案
foo(int)
只存在于 if
的范围内,所以没有。我认为这是不可能的。一般来说,我可能会使用类似于您使用 map
和 collect
的第一段代码,因为 foo
仅在那个上下文。
在某些情况下,也可以完全重新表述问题。例如,这可以使用 flatMap
缩短:
def foo(i: Int): Option[Int] = Option(i).filter(_ > 1)
scala> Seq(1, 2).flatMap(foo)
res0: Seq[Int] = List(2)
关于scala - 我们可以在比赛中重用守卫内部的中间变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31216940/