Scala Futures 和 Java 8 CompletableFuture

18

Java 8引入的CompletableFuture为语言带来了像scala.concurrent.Future中的单子变换等功能。

  • Scala开发人员为什么应该更喜欢使用Scala Futures而不是java 8的CompletableFuture?它们有什么区别?

  • 是否仍有充分理由通过akka.dispatch桥在Java中使用scala.concurrent.Future


在我看来,因为CompletableFuture上的单子操作与Java 8或Scala集合中的单子操作没有一致的定义,所以语义不一致。对我来说,这样的语义似乎也太冗余了。此外,你将不得不处理Java-Scala互操作性,而没有从中获得任何利益。 - dk14
你能详细说明一下你的评论吗?另外,使用akka.dispatch桥在Java中使用Scala futures怎么样? - Edmondo
  1. 我的意思是 CompletableFuture 上没有 stream 方法,所以你不能像平常一样调用 map-reduce(以及 filter 等函数) - 必须使用一些丑陋的方法。当然,CompletableFuture 没有 for-comprehension。我没有在实践中使用过 CompleteFuture(它太丑了) - 所以无法完全回答你的问题。
  2. 据我所知,这个主题是关于 Scala 中 Java 的 futures。
- dk14
你关于for comprehension的观点是正确的。我还添加了第二个观点,你能否提供一下你的意见? - Edmondo
2
存在一些潜在的互操作性问题:akka.dispatch.Future需要scala的函数。对于Scala 2.11/2.12,Java 8函数有一个实验性的互操作性 - https://github.com/scala/scala-java8-compat,但你知道它是实验性的。 - dk14
这篇博客可能会为Scala Future提供一些背景:http://danielwestheide.com/blog/2013/01/16/the-neophytes-guide-to-scala-part-9-promises-and-futures-in-practice.html - Others
1个回答

21
有什么差异,为什么Scala开发者应该优先选择Scala Futures而不是Java 8 CompletableFuture?
重新表述@dk14在评论中指出的,我可以说CompletableFuture没有惯用的Scala API。
对于Scala开发人员,影响如下:
  • 缺乏for推导式,因为它不遵循单调类型常见的Scala方法约定
  • 需要使用其大部分方法时需要Java-Scala交互开销
还值得注意的是,Java CompletableFuture并不完全等同于Scala Future。它更像是Scala FuturePromise的融合体。
考虑到上面列出的缺点,在Scala中使用CompletableFuture没有太多意义,除非您正在设计与Java无缝互操作的公共API。
是否仍有理由通过akka.dispatch桥在Java中使用scala.concurrent.Future?

我特别寻找使用akka.dispatch在Java中的原因,如果仍然有任何原因

Akka是建立在Scala之上的,有时会使用Scala的Future。这意味着,在您的代码中有些部分是用Java编写的情况下,值得将其包装在Scala API中(使用akka.dispatch Java API),以便能够轻松地与Akka一起使用。
例如,您正在Java中实现Akka actor。在处理消息时,您希望进行一些非阻塞读取,当完成时,应将其作为消息产生给另一个actor。
你可以将输入/输出放入Java的Callable中,然后使用akka.dispatch.Futures#future将其转换为Scala的Future,最后可以利用akka pipe将未来的结果作为消息传递给某个actor。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接