我从answer中学到的andThen含义是一个函数编写器。

比如说

f andThen g andThen h

将等于
h(g(f(x)))

这意味着h function将接收来自g(f(x))的输入

但是对于andThen中的Future,以下所有闭包andThen始终从原始Future接收结果。
Future{
    1
}.andThen{ case Success(x) =>
    println(x) // print 1
    Thread.sleep(2000)
    x * 2
}.andThen{ case Success(x) =>
    println(x) // print 1
    Thread.sleep(2000)
    x * 2
}

相比于
val func: Function1[Int, Int] = { x: Int =>
  x
}.andThen { y =>
  println(y) // print 1
  y * 2
}.andThen { z =>
  println(z) // print 2
  z * 2
}
func(1)

是什么原因使Future::andThen从原始Future中获得所有相同的结果,而不是链接Future?我观察到,这些链接的andThen将顺序执行,因此原因可能不是出于并行目的。

最佳答案

scala.concurrent.Future设计为两种异步方法的折衷方案:

  • 面向对象的observer,它允许绑定(bind)异步处理程序
  • 功能monad提供了丰富的功能组合功能。

  • Future.andThen 's docs:



    因此andThen最有可能来自OOP Universe。要获得与oj​​it_code类似的结果,可以使用 Function1.andThen 方法:
    Future(1).map {_ * 2}.map {_ * 2}
    
    mapandThen的不同之处在于一件事:onComplete的Future仍返回相同的结果,但是将等待直到提供的观察者返回或抛出某些东西。这就是为什么在文档中写的原因:



    另请注意文档中的第三行:



    因此,对新andThen的结果完全不执行任何操作。它自己的异常(exception)甚至无法破坏它。此FutureandThen只是观察者的顺序和并行绑定(bind)。

    10-07 16:30