使用
CompletableFuture
(相对于 Project Rector 的 Mono
)时,是否有替代 Project Reactor 的 filter()
方法?也就是说,如果传递的谓词计算结果为 false
,我希望未来为空
换句话说,我想要一个更漂亮的替代方案:
private void consumeResultIfPresent() {
if (isConditionMet())
getCompletableFuture().thenAccept(this::consumeResult);
}
private void consumeResultIfPresent_butPrettier() {
getCompletableFuture().filter(v -> isConditionMet()).thenAccept(this::consumeResult);
}
遗憾的是,我们的类路径中没有 Project Reactor,所以我不得不求助于使用 Java 的标准并发库(这并不是那么糟糕,但似乎功能不足) 自己进行过滤的“胖”消费者是次优的
这是我发现的唯一(远程)类似问题据我所知,不存在空的CompletableFuture
都与可能的
null
值相关联。
如果条件不依赖于值并且可以在
CompletableFuture
完成之前进行评估,那么您的第一个方法就可以了。
如果需要在
CompletableFuture
完成后评估条件,则需要使用 thenAccept
、
thenApply
或
thenRun
。使用
Optional
这样我们就可以使用 lambda 表达式而不是块:
private void consumeResultIfPresent_butPrettier() {
getCompletableFuture().thenAccept(value -> Optional.ofNullable(value)
.filter(v -> isConditionMet())
.ifPresent(this::consumeResult));
}
如果你想要一个“空”CompletableFuture
,我唯一能想到的是CompetableFuture<Optional<T>>
而不是
CompletableFuture<T>
。您仍然需要
thenAccept
,但它可以在可能为空的
Optional
上工作。
private void consumeResultIfPresent_butPrettier() {
getCompletableFuture().thenAccept(o -> o
.filter(v -> isConditionMet())
.ifPresent(this::consumeResult));
}