如何连接两个Scala期货
我有两个未来的职能:如何连接两个Scala期货,scala,future,Scala,Future,我有两个未来的职能: def parseIntFuture(str: String) = Future{scala.util.Try(str.toInt).toOption} def divideFuture(a: Int, b: Int) = Future{ if (b == 0) None else Some(a / b)} 现在我想连接它们,最终得到一个Future[Option[Int]]type结果,这是第二个返回值,但如果我这样做: def stringDivideBy(aStr:
def parseIntFuture(str: String) = Future{scala.util.Try(str.toInt).toOption}
def divideFuture(a: Int, b: Int) = Future{ if (b == 0) None else Some(a / b)}
现在我想连接它们,最终得到一个Future[Option[Int]]
type结果,这是第二个返回值,但如果我这样做:
def stringDivideBy(aStr: String, bStr: String) = {
val x = for {
aNum <- parseIntFuture(aStr)
bNum <- parseIntFuture(bStr)
} yield (aNum, bNum)
x.map(n => {
for{
a <- n._1
b <- n._2
} yield divideFuture(a, b)
})
}
def stringDivideBy(aStr:String,bStr:String)={
val x=用于{
aNum有一个叫做的东西正好解决了这个问题。使用option
,您的代码看起来有点像
import cats.data.OptionT
// ...
val x = (for {
aNum <- OptionT(parseIntFuture(aStr))
bNum <- OptionT(parseIntFuture(bStr))
res <- OptionT(divideFuture(aNum, bNum))
} yield res).value
像这样简单的东西,你不需要单子变形金刚和其他“重炮”,一般的规则是不要让你的代码变得比绝对需要的更复杂
(parseIntFuture(foo) zip parseIntFuture(bar))
.flatMap {
case (Some(a), Some(b)) => divideFuture(a, b)
case _ => Future.successful(None)
}
…它的另一个优点是zip
不会强制a
和b
按顺序排列。很好。
(parseIntFuture(foo) zip parseIntFuture(bar))
.flatMap {
case (Some(a), Some(b)) => divideFuture(a, b)
case _ => Future.successful(None)
}