过滤CompletableFutures

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

使用

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 的标准并发库(这并不是那么糟糕,但似乎功能不足) 自己进行过滤的“胖”消费者是次优的

这是我发现的唯一(远程)类似问题

据我所知,不存在空的
java concurrency
1个回答
0
投票
。每个

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));
}


© www.soinside.com 2019 - 2024. All rights reserved.