Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何连接两个Scala期货_Scala_Future - Fatal编程技术网

如何连接两个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)
   }