gpt4 book ai didi

scala - future Scala的 future

转载 作者:行者123 更新时间:2023-12-03 09:07:31 29 4
gpt4 key购买 nike

我正在围绕Java库编写一个小的Scala包装器。

Java库有一个对象QueryExecutor,它公开了2种方法:

  • execute(query):结果
  • asyncExecute(query):ListenableFuture [Result]

  • 在这种情况下,ListenableFuture是来自 Guava 库的一种。

    我希望我的Scala包装器返回Future [Result]而不是java对象,但是我不确定实现该目标的最佳方法是什么。这是我提出的2个解决方案:
    future {
    executor.execute(query)
    }


    val p = promise[Result]
    val guavaFuture = executor.asyncExecute(query)

    Futures.addCallback(guavaFuture, new FutureCallback[Result] {
    def onFailure(t: Throwable) {
    p.failure(t)
    }

    def onSuccess(result: Result) {
    p.success(result)
    }
    })

    p.future

    我想知道哪种方法最好。我的直觉是,第一个在返回Future的同时仍将阻塞线程,而执行调用等待响应,而第二个看起来应该是非阻塞的。对每种方法的利弊有何评论?

    最佳答案

    第二种选择是最好的,它使所有内容保持异步。但是...您可以做得更好,并将解决方案抽象为可重用的模式:

    implicit class RichListenableFuture[T](lf: ListenableFuture[T]) {
    def asScala: Future[T] = {
    val p = Promise[T]()
    Futures.addCallback(lf, new FutureCallback[T] {
    def onFailure(t: Throwable): Unit = p failure t
    def onSuccess(result: T): Unit = p success result
    })
    p.future
    }
    }

    然后,您可以简单地调用:
    executor.asyncExecute(query).asScala

    关于scala - future Scala的 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18026601/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com