如何从 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();
}
而且SomeObjectType1
和SomeObjectType2
里面都有一个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
,因为它们一起使用效果更好。
我有一个代码片段,它根据某些 if
条件调用 2 个不同的服务。并且这两个服务 return CompletableFuture<Optional<SomeObject>>
。以下是代码逻辑看起来像
if(someCondition){
CompletableFuture<Optional<SomeObjectType1>> = service1.call();
}else{
CompletableFuture<Optional<SomeObjectType2>> = service2.call();
}
而且SomeObjectType1
和SomeObjectType2
里面都有一个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
,因为它们一起使用效果更好。