代码之家  ›  专栏  ›  技术社区  ›  coder25

布尔值期货交易

  •  0
  • coder25  · 技术社区  · 7 年前
    def f1 = Future(true)
    def f2 = Future(false)
    
    case class Test(flag :Boolean= false , id :String)
    

    F1和F2是处理返回的方法 Future[Boolean] 。如果 boolean 但我们如何在未来做到这一点呢 new Test(id="123").copy(flag = f1 && f2) 不工作

    2 回复  |  直到 7 年前
        1
  •  3
  •   Alexey Romanov    7 年前

    @leoc给出了一个很一般的答案,但是 a specific method 将两个期货的结果与一个函数结合:

    f1.zipWith(f2) { _ && _ }
    

    如果我必须在f1为真后计算f2,如果f1为假,则不应计算f2

    那么,恐怕你需要这样的东西

    f1.flatMap { x => if (x) f2 else Future.successful(false) }
    

    至少目前我还没有看到更好的选择。

    但请注意,这并不一定好:在第一个解决方案中 f1 f2 可以同时评估,因此这通常比评估更快 F1 在你开始之前 F2 .

    您也可以修改它,这样两个都是一起启动的,如果其中一个是 false 然后结合未来立即完成 但这是更复杂的代码。

        2
  •  4
  •   Leo C    7 年前

    你可以使用 for-comprehension 从f1和f2的值中产生一个未来,然后 map/recover 要返回派生case类的未来:

    import scala.concurrent.Future
    import scala.concurrent.ExecutionContext.Implicits.global
    import scala.util.{Try, Success, Failure}
    
    def f1 = Future{ true }
    def f2 = Future{ false }
    
    case class Test(flag: Boolean = false, id: String)
    
    val f = for {
      x <- f1
      y <- f2
    } yield x && y
    
    f.map( z => Test(id = "123").copy(flag = z) ).recover{ case e => "Failure: " + e }
    // res1: Future[java.io.Serializable] = Future(Success(Test(false,123)))
    

    要捕获容器类型中的成功/失败值,请 映射/恢复 回归未来 Either[Throwable, Test] :

    f.map( z => Right(Test(id = "123").copy(flag = z)) ).recover{ case e => Left(e) }
    // res2: Future[Product with Serializable with Either[Throwable,Test]] =
    //   Future(Success(Right(Test(false,123))))
    

    或使用 onComplete 要简单地输出成功/失败值:

    f.onComplete{
      case Success(z) => println("Success: " + Test(id = "123").copy(flag = z))
      case Failure(e) => println("Failure: " + e)
    }
    // Success: Test(false,123)
    

    或者,使用 flatMap/map 而不是 为了理解 :

    f1.flatMap(x => f2.map(y => x && y)).
      map( z => Test(id = "123").copy(flag = z) ).recover{ case e => "Failure: " + e }
    
    推荐文章