如何从 CompletableFuture 获取不同的可选类型的对象

How to get Different Optional type of Object from CompletableFuture

我有一个代码片段,它根据某些 if 条件调用 2 个不同的服务。并且这两个服务 return CompletableFuture<Optional<SomeObject>>。以下是代码逻辑看起来像

if(someCondition){
  CompletableFuture<Optional<SomeObjectType1>> = service1.call();
}else{
  CompletableFuture<Optional<SomeObjectType2>> = service2.call();
}

而且SomeObjectType1SomeObjectType2里面都有一个String,这是我感兴趣的。我当前的代码如下所示:

private ContentWrapper getContentWrapper(input1, input2, ....) {
    String content = null;
    if (some_condition is true) {
        List<Object_Type_1> list = service1.fetchTheCompletableFuture(..... inputs...)
                .join()
                .map(ListOutput::getList)
                .orElse(null);
        if (CollectionUtils.isNotEmpty(list)) {
            content = list.get(0).getContent();
        }
    } else {
        content = service2
                .fetchTheCompletableFuture(..... inputs...)
                .join()
                .map(RenderedContent::getContent)
                .orElse(null);
    }
    return content != null ? new ContentWrapper(content) : null;
}

现在我的问题是,是否可以删除此 if-else 子句或使用 lambda 使其更清楚。我是 lambda 的新手,对此不是很了解。

由于含糊不清,我不确定下面的代码是否可以编译。

private ContentWrapper getContentWrapper(input1, input2, ....) {
    Optional<RenderedContent> content = some_condition
        ? service1
                .fetchTheCompletableFuture(..... inputs...)
                .join()
                .map(ListOutput::getList)
                .stream()
                .findFirst()
        : service2
                .fetchTheCompletableFuture(..... inputs...)
                .join();
    }
    return content
                .map(RenderedContent::getContent)
                .map(ContentWrapper::new).orElse(null);
}
  • 第一个服务似乎产生了一个 RenderedContent 列表,如果有的话,将第一个拿走。
  • 第二个服务可能会立即生成渲染内容。

因此您可以将 if-else 加入 Optional<RenderedContent>。 如果 map(RenderedContent::getContent) 一开始是空的,它将产生 Optional.empty() 。否则 getContent 被调用并包装在 Optional 中。 如果存在 new ContentWrapper(...) 可能会被调用。

注意很多可能会失败,比如 getContent 返回 null(尽管有 Optional.ofNullable.

尽管如此,Streams 可能非常具有表现力。

我会避免使用 null 来支持 Optional,因为它们一起使用效果更好。