CompletableFuture 有时可能为 null 如何处理

问题描述 投票:0回答:1

我有这些 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
为空的情况,我应该如何处理?

java spring-boot completable-future
1个回答
0
投票

您需要在

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);
        });
}
© www.soinside.com 2019 - 2024. All rights reserved.