java - Guava future 如何上链?

标签 java guava future

我正在尝试创建一个小型服务来接受文件上传、解压缩然后删除上传的文件。这三个步骤应该作为 future 链接起来。我正在使用 Google Guava 库。

工作流程是:

A future 下载文件,如果操作完成,则a future 解压文件。如果解压缩完成,将来会删除原始上传的文件。

但老实说,我不清楚我将如何链接 future ,甚至如何以 Guava 的方式创建它们。文档简明扼要且不清楚。好的,有 transform 方法,但根本没有具体示例。 chain 方法已弃用。

我想念 RxJava 库。

最佳答案

Futures.transform不像 RxJava 那样可以流畅地链接,但您仍然可以使用它来设置 Future这是相互依赖的。这是一个具体的例子:

final ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());

final ListenableFuture<FileClass> fileFuture = service.submit(() -> fileDownloader.download())
final ListenableFuture<UnzippedFileClass> unzippedFileFuture = Futures.transform(fileFuture, 
      //need to cast this lambda
      (Function<FileClass, UnzippedFileClass>) file -> fileUnzipper.unzip(file));
final ListenableFuture<Void> deletedFileFuture = Futures.transform(unzippedFileFuture, 
      (Function<UnzippedFileClass, Void>) unzippedFile -> fileDeleter.delete(unzippedFile));
deletedFileFuture.get(); //or however you want to wait for the result

这个例子假设fileDownloader.download()返回 FileClass 的实例, fileUpzipper.unzip()返回 UnzippedFileClass等 如果FileDownloader.download()而是返回 ListenableFuture<FileClass> , 使用 AsyncFunction而不是 Function .

为简洁起见,此示例还使用了 Java 8 lambda。如果您不使用 Java 8,请传入 Function 或 AsyncFunction 的匿名实现:

Futures.transform(fileFuture, new AsyncFunction<FileClass, UpzippedFileClass>() {
        @Override
        public ListenableFuture<UnzippedFileClass> apply(final FileClass input) throws Exception {
            return fileUnzipper.unzip();
        }
    });

有关 transform 的更多信息这里:http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/util/concurrent/Futures.html#transform (滚动或搜索“转换”——深层链接目前似乎已损坏)

关于java - Guava future 如何上链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27920856/

相关文章:

java - 我可以在我的java代码中使用两个ssh java lib吗?

java - 使用 MySQL 的 SimpleJdbcInsert

java - 打印 2 位数字,但以 6 位精度舍入

java - 如何在方法抛出 Checked-Exception 时使用 Suppliers.memoize

scala - Scala中,Future[Option[A]]如何进行类型转换?

dart - dart 中的 future /完成行为不异步运行

scala - 什么时候应该避免在 Scala 中使用 Future

java - 解析数组,其中有对象数组

java - 使用 Guava Reflection 引用私有(private)字段

java - 为什么这个 Guava 按值排序 map 有效?