web-dev-qa-db-ja.com

a Java Futureをa Scala Futureに変換する

Java Futureに変換したいScala Futureオブジェクトがあります。

j.u.c.Future AP​​Iを見ると、isDoneメソッド以外に使用できるものはほとんどありません。このisDoneメソッドはブロックされていますか?

現在、これは私が心に抱いていることです:

val p = Promise()
if (javaFuture.isDone())
  p.success(javaFuture.get)

これを行うためのより良い方法はありますか?

13
sparkr

それをラップするのはどうですか(ここに暗黙のExecutionContextがあると仮定しています):

val scalaFuture = Future {
    javaFuture.get
}

編集:

単純なポーリング戦略は次のようになります(Java.util.Future => F):

def pollForResult[T](f: F[T]): Future[T] = Future {
    Thread.sleep(500)
    f
  }.flatMap(f => if (f.isDone) Future { f.get } else pollForResult(f))

これにより、Java futureが500msごとに実行されるかどうかがチェックされます。明らかに合計ブロッキング時間は上記と同じです(最も近い500msに切り上げられます)が、このソリューションでは他のタスクをインターリーブできます。 ExecutionContextの同じスレッド。

13
pablochan

開始Scala 2.13、標準ライブラリには scala.jdk.FutureConverters これはJavaからScala CompletableFuture/Future暗黙の変換:

import scala.jdk.FutureConverters._

// val javaFuture = Java.util.concurrent.CompletableFuture.completedFuture(12)
val scalaFuture = javaFuture.asScala
// scalaFuture: scala.concurrent.Future[Int] = Future(Success(12))
10
Xavier Guihot

Java FutureからScala Futureへの変換には、FutureConvertors(Scalaの組み込みutil)を使用します。

Java Future [Int]をScala Future [Int] ::に変換する例を考えてみましょう。

import Java.util.concurrent.CompletableFuture
import scala.compat.Java8.FutureConverters

val javaFuture: Java.util.concurrent.Future[Int] = ??? 
// Some method call which returns Java's Future[Int]

val scalaFuture: Future[Int] = 
FutureConverters.toScala(CompletableFuture.supplyAsync(new Supplier[Int] {
      override def get(): Int = javaFuture.get 
    }))

同様に、Intの代わりに任意のカスタムタイプに対して実行できます。

7
Sanjyot Bandal

今この質問を読んでいる人のために、Scala 2.13以降を使用している場合は、以下を使用してください。

_import scala.jdk.FutureConverters._
_

そして、_completableFuture.asScala_を使用して変換します

Scala 2.12以下を使用している場合は、

_import scala.compat.Java8.FutureConverters
_

そして、次を使用して変換します:toScala(completableFuture)または_completableFuture.toScala_

また、Scala 2.12で、正しいアーティファクトを使用していることを確認してください。

_org.scala-lang.modules:scala-Java8-compat_2.12:0.9.0
_

さて、何らかの理由であなたが持っているものが実際にはFutureではなくCompletableFutureである場合、これは最近ではまれなケースですが、これらの答えの最初の1つに従ってください: Transform Java Future into a CompletableFuture

1
Alexey Soshin