如何链接有副作用的操作?

How to chain operations with side effects?

我有两种方法允许以异步方式访问底层存储

private Mono<String> read(String key) { }
private Mono<Boolean> delete(String key) { }

我想创建另一个异步方法,它将读取值并在返回读取值时立即将其删除。我能够以一种非常丑陋的方式来管理它。

public Mono<String> readAndDelete(String key) {
    Mono<String> read = read(key).cache();
    return read.then(delete(key)).then(read);
}

但我确信必须存在更优雅和正确的方法。我该如何实现?

除了Auktis提出的答案,用delayUntil方法

也可以达到类似的效果
public Mono<String> readAndDelete(String key) {
    return read(key).delayUntil(value -> delete(key));
}

根据文档 delayUnit 解析单声道,然后触发另一个指定为参数的单声道,最后 returns 第一个解析的单声道的结果。

这里有一个命题 - 我希望 - 更优雅的方式:

public Mono<String> readAndDelete(String key) {
    return read(key)
        .flatMap(value -> delete(key)
            .thenReturn(value)
        );
}