【问题标题】:Scala Futures and java 8 CompletableFutureScala 期货和 java 8 CompletableFuture
【发布时间】:2015-04-19 18:15:18
【问题描述】:

在 Java 8 中引入 CompletableFutures 带来了 scala.concurrent.Future 中可用的语言特性,例如一元转换。

  • 有什么区别,为什么 Scala 开发人员应该更喜欢 Scala Futures 而不是 java 8 CompletableFuture

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

【问题讨论】:

  • 恕我直言,因为 CompletableFuture 上的单子操作在 Java 8 和 Scala 集合中都没有与单子操作一致地定义 - 所以语义不一致。而且对我来说,这种语义似乎太多余了。 + 您将不得不处理 Java-Scala 互操作性,而不会从中获利。
  • 你能用我的回答详细说明你的评论吗?在 Java 中使用 Scala 期货的 akka.dispatch 桥怎么样?
  • 1) 我的意思是 CompletableFuture 上没有 stream 方法,所以你不能像往常一样在那里调用 map-reduce (以及像过滤器这样的结果函数) - 必须使用一些丑陋的方法。当然也没有 CompletableFuture 的理解。我在实践中没有使用 CompleteFuture(它太丑了) - 所以不能完全回答你的问题 2)据我所知,这个话题是关于 java 在 scala 中的未来。
  • 你对 for 理解是正确的。我还补充了第二点,能否请您发表一下意见?
  • 存在一些潜在的互操作性问题:akka.dispatch.Future 需要 scala 的函数。 Scala 2.11/2.12 - github.com/scala/scala-java8-compat 与 Java 8 函数有一个实验性的互操作性,但你知道它是实验性的。

标签: java scala akka java-8


【解决方案1】:

有什么区别,为什么 Scala 开发人员应该更喜欢 Scala Futures 而不是 java 8 CompletableFuture?

改写 @dk14 在 cmets 中指出的内容,我会说 CompletableFuture 没有惯用的 Scala api。

对于 Scala 开发者来说,含义是:

  • 由于不遵循单子类型常见的 Scala 方法约定,因此缺乏 for 理解
  • 使用大部分方法时需要 java-scala 互操作开销

同样值得注意的是,java CompletableFuture 并不完全等同于 scala Future。它是scala FuturePromise 的导火索。

考虑到上面列出的缺点,在 scala 中使用 CompletableFuture 没有多大意义,除非您正在设计应该与 java 无缝互操作的公共 api。

还有充分的理由通过 akka.dispatch 桥在 Java 中使用 scala.concurrent.Future 吗?

我特别在寻找在 Java 中使用 akka.dispatch 的理由,如果还有的话

Akka 建立在 scala 之上,它有时使用 scala Futures。这意味着,如果您有部分代码是用 java 编写的,则值得将其包装在 scala api(使用 akka.dispatch java api)中,以便能够轻松地将其与 akka 一起使用。

例如,您正在 java 中实现 akka actor。在处理消息时,您希望进行一些非阻塞读取,完成后,应该将结果作为消息发送给另一个参与者。

你可以做的是将你的 I/O 放入 java Callable,然后使用 akka.dispatch.Futures#future 从中获取 scala Future,然后你可以利用 akka pipe 来生成未来的结果作为消息传递给某个参与者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-14
    • 2019-03-23
    • 1970-01-01
    • 2013-04-27
    • 2015-07-22
    • 2021-03-02
    • 1970-01-01
    • 2017-11-18
    相关资源
    最近更新 更多