Skip to content
Advertisement

How to chain operations with side effects?

I have two methods that allows to get an access to underlying storage in async manner

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

I want to create another async method that will read value and delete it immediately with returning of read value. I was able to manage it in a really ugly way.

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

But I’m sure more elegant and correct way to do it have to exist. How I can achieve it?

Beside answer proposed by Auktis, similar effect can be achieved with delayUntil method

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

In accordance to documentation delayUnit resolves mono, then triggers another mono specified as an argument and finally returns the result of the first resolved mono.

Advertisement

Answer

Here is a proposition of a − I hope − more elegant way:

public Mono<String> readAndDelete(String key) {
    return read(key)
        .flatMap(value -> delete(key)
            .thenReturn(value)
        );
}
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement