Return 另一个 CompletableFuture 中的 CompletableFuture 内的值和 return 那个未来

Return a value inside a CompletableFuture in another CompletableFuture and return that future

我想在另一个 CompletableFuture 和 return 那个未来的 CompletableFuture(在本例中为 clonedWorld)中获取一个值。这是我的代码,我被困在这里:

@Override
public CompletableFuture<SlimeWorld> asyncCloneWorld(String worldName, String newWorld) {
    loadWorldAsync(worldName).whenComplete((slimeWorld, throwable) -> {
        if (throwable != null || slimeWorld.isEmpty()) {
            plugin.getLogger().log(Level.SEVERE, "Impossibile caricare il mondo template!", throwable);
            return;
        }
        try {
            SlimeWorld clonedWorld = slimeWorld.get().clone(newWorld, loader, true);
        } catch (IOException | WorldAlreadyExistsException e) {
            plugin.getLogger().log(Level.SEVERE, "Non è stato possibile clonare il mondo: " + worldName, e);
        }
    });
  return ?;
}

你的问题是 whenComplete() 只接受一个 BiConsumer 作为参数,它不能处理 returned CompletableFuture 的结果——除非抛出异常.

如果您想更改结果(此处从类似 Optional<SlimeWorld> 或仅 SlimeWorldnull 的例外)使用的适当方法是 handle() .因此,传递给 handle() 的 lambda 应该是 return 最终结果(克隆的世界或 null)。

并且由于 CompletableFuture 是流利的 API,您可以 return 来自 asyncCloneWorld()handle() 调用的结果:

public CompletableFuture<SlimeWorld> asyncCloneWorld(String worldName, String newWorld) {
    return loadWorldAsync(worldName).handle((slimeWorld, throwable) -> {
        if (throwable != null || slimeWorld.isEmpty()) {
            plugin.getLogger().log(Level.SEVERE, "Impossibile caricare il mondo template!", throwable);
            return null;
        }
        try {
            return slimeWorld.get().clone(newWorld, loader, true);
        } catch (IOException e) {
            plugin.getLogger().log(Level.SEVERE, "Non è stato possibile clonare il mondo: " + worldName, e);
            return null;
        }
    });
}