scala - 我们可以在比赛中重用守卫内部的中间变量吗?

标签 scala

假设我有一个方法 foo 作为:

def foo(i:Int):Option[Int] = ??? // some code

现在我想对 IntSeq 进行如下操作:

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 的范围内,所以没有。我认为这是不可能的。一般来说,我可能会使用类似于您使用 mapcollect 的第一段代码,因为 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/

相关文章:

scala - 从 Kafka 进行流聚合时在 "deadlock"中运行

Scala 2.12 使用 Java 1.8;如果无法升级到Java 1.8怎么办?

xml - scalaxb 生成的代码在编译期间导致堆栈溢出

scala - 让 Scala 解释器在解释调用之间忘记

scala - Coproduct 对 `sealed trait` 的好处?

java - 在 Spark 外部加载 Mllib 模型

Scala 将逗号分隔的字符串转换为数组

performance - 斯卡拉 : Writing String Iterator to file in Efficient way

scala - 如何在 Scala 中创建具有不同长度的 2d int 数组?

scala - 如何在scala中编写函数isCaseObject?