我有这些 CompletableFutures:
CompletableFuture<Info> futureA =
createFutureA(multipleItems, startDate, source, context);
CompletableFuture<PPPInfo> futureB =
createFutureB(multipleItems, startDate, source, context);
CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(futureA, futureB);
futureA
调用 createFutureA
,如下所示:
private CompletableFuture<PPPInfo> createFutureA(
MultipleItems multipleItems,
String startDate,
Source source,
Context context) {
return CompletableFuture.supplyAsync(
() ->
getItemAPrice(
Double.parseDouble(multiplePrices.getItemA().getPrice()),
startDate,
source,
ITEMA,
context));
}
在某些情况下,
multiplePrices.getItemA()
是 null
,这会导致 NullPointerException
中出现 createFutureA
,并且当应用程序调用 combinedFuture.get()
时会出现问题。如果我可能遇到 futureA
为空的情况,我应该如何处理?
您需要在
createFutureA
中处理 null。
如果
multiplePrices.getItemA()
是常规(同步)函数,则可以使用如下所示的函数。
private CompletableFuture<PPPInfo> createFutureA(
MultipleItems multipleItems,
String startDate,
Source source,
Context context) {
Item itemA = multiplePrices.getItemA();
if (itemA == null) {
return CompletableFuture.completedFuture(null);
}
return CompletableFuture.supplyAsync(
() ->
getItemAPrice(
Double.parseDouble(itemA.getPrice()),
startDate,
source,
ITEMA,
context));
}
如果
multiplePrices.getItemaA()
也是一个异步函数,返回一个可完成的 future,像下面这样的东西就可以了。
private CompletableFuture<PPPInfo> createFutureA(
MultipleItems multipleItems,
String startDate,
Source source,
Context context) {
return multiplePrices.getItemA()
.thenApply(itemA => {
if (itemA == null) {
return CompletableFuture.completedFuture(null);
}
return getItemAPrice(
Double.parseDouble(itemA.getPrice()),
startDate,
source,
ITEMA,
context);
});
}