如何避免在collectFirst调用上重复工作?

时间:2018-01-02 18:12:55

标签: scala

我有这样的事情:

   val yyy = aListOfObjects.collectFirst{
     case x if(x.calc("input").isDefined) => x.calc("input").get
   }

我有一些事情清单。如果计算成功与否,每个东西都有一个方法calc,它可以恢复可选结果。

我希望通过事物列表并带回第一个成功的计算值,如果没有,则返回None。

上面的剪辑可以做到这一点,但是......你会看到我两次调用x.calc()。假设对calc的调用非常重要,我怎么能避免双重调用? (我也不想在所有事情上预先调用calc(),因为我只关心第一个有效的方法。)

1 个答案:

答案 0 :(得分:1)

你可以使用Streams在scala中懒惰的事实:

aListOfObjects
  .toStream
  .flatMap { _.calc("input") }
  .headOption

或定义您自己的提取器:

object Calc {
   def unapply(x: TypeOfX) = x.calc("input")
}

现在,你可以写:listOfObject.collectFirst { case Calc(x) => x }