我有这样的手术,
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),如果为真,则不需要其余的操作。我不想抛出异常来取消其余部分,因为这不是例外情况。除了将布尔值传递给每个操作之外,还有其他不错的方法吗?
谢谢
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);