我有这样的事情:
val yyy = aListOfObjects.collectFirst{
case x if(x.calc("input").isDefined) => x.calc("input").get
}
我有一些事情清单。如果计算成功与否,每个东西都有一个方法calc,它可以恢复可选结果。
我希望通过事物列表并带回第一个成功的计算值,如果没有,则返回None。
上面的剪辑可以做到这一点,但是......你会看到我两次调用x.calc()。假设对calc的调用非常重要,我怎么能避免双重调用? (我也不想在所有事情上预先调用calc(),因为我只关心第一个有效的方法。)
答案 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 }