停止供应商内部的CompletableFuture链接

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

我有这样的手术,

public void createFuture() {
    CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 5);
    future.thenApply(i -> {
        if (i == 5) {
            System.out.println("hello, i equals to 5 so expensive operations are unnecessary");
        }
        return i;
    }).thenApply(i -> {
        if (i != 5) {
            System.out.println("Expensive operation");
        }
        return i;
    }).thenApply(i -> {
        if (i != 5) {
            System.out.println("Expensive operation");
        }
        return i;
    }).thenApply(i -> {
        if (i != 5) {
            System.out.println("Expensive operation");
        }
        return i;
    }).thenApply(i -> {
        if (i != 5) {
            System.out.println("Expensive operation");
        }
        return i;
    });

}

这里在第一块中,我检查了一些条件(i == 5),如果为真,则不需要其余的操作。我不想抛出异常来取消其余部分,因为这不是例外情况。除了将布尔值传递给每个操作之外,还有其他不错的方法吗?

谢谢

java completable-future
1个回答
0
投票

CompletableFuture没有支持条件语句的机制。在您的情况下,可以通过将i != 5的所有任务提取为带有CompletableFuture的一个thenCompose来简化代码。

其他解决方法是创建地图,对其进行过滤并使用它创建可完成的未来:

Map<Predicate<Integer>, Runnable> m = Map.of(
    integer -> integer == 5,
    () -> System.out.println("Task 1"),
    integer -> integer != 5,
    () -> System.out.println("Task 1"),
    integer -> integer != 5,
    () -> System.out.println("Task 1")
);
CompletableFuture[] runnables = m.entrySet().stream()
    .filter(e -> e.getKey().test(5))
    .map(Map.Entry::getValue)
    .map(CompletableFuture::runAsync)
    .toArray(CompletableFuture[]::new);
CompletableFuture composed = CompletableFuture.allOf(runnables);
© www.soinside.com 2019 - 2024. All rights reserved.