在Scala中,您可以使用map
和flatMap
来运行未来成功结果的函数。
val x: Future[Int] = ...
val y: Future[String] = x.map(_.toString)
是否有比这更好的Clojure类似物:
(def x (promise))
(def y (future (str @x)))
在等待x
的送达时,上面阻止了一个帖子?
答案 0 :(得分:2)
在尝试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"
你甚至可以提出一个类似于线程->, ->>
宏但为每个线程表达式创建未来的宏,但我认为当你使用普通函数执行此操作时,这将是一种过度杀伤。