在 Scala 中,您可以使用map
和flatMap
在未来的成功结果上运行函数。
val x: Future[Int] = ...
val y: Future[String] = x.map(_.toString)
有没有比这更好的 Clojure 类似物:
(def x (promise))
(def y (future (str @x)))
上面的线程在等待交付时不会阻塞x
吗?
在 Scala 中,您可以使用map
和flatMap
在未来的成功结果上运行函数。
val x: Future[Int] = ...
val y: Future[String] = x.map(_.toString)
有没有比这更好的 Clojure 类似物:
(def x (promise))
(def y (future (str @x)))
上面的线程在等待交付时不会阻塞x
吗?
在您尝试 dref y 的值之前,您的 clojure 代码不会阻塞
(def x (promise)) ;wont block
(def y (future (str @x))) ;wont block
(print @y) ;will block
就类比而言,代码看起来不错。但是,如果您想要某种更具声明性的链接期货的方式,即概念上的简化,那么您可以使用reduce
如下所示:
(def x (promise))
(def final (reduce #(future (%2 @%1))
x
[inc dec (partial + 10) str]))
(deliver x 10)
@final => "20"
你甚至可以想出一个类似于线程->, ->>
宏但为每个线程表达式创建期货的宏,但我认为如果你可以使用普通函数来做到这一点,那将是一种矫枉过正。