---
title: Reactorで返り値がMono<Void>の処理の後、引数をそのまま返すときのショートカット
tags: ["Reactor", "Java"]
categories: ["Programming", "Java", "reactor", "core"]
date: 2017-11-23T07:08:52Z
updated: 2017-11-23T07:10:32Z
---

メモ

こういうインターフェースがあるとする。

``` java
public interface FooService {
  Mono<Void> save(Foo foo);
}
```

次のような処理を書きたくなることがちょくちょく出てくる。

``` java
Mono<Foo> foo = request.bodyToMono(Foo.class);
Mono<Foo> saved = foo.flatMap(fooService::save).then(foo);
```

`Mono<Void>`が返り値な処理が終わってから、その引数をそのまま返したいみたいなとき、
わざわざ`then`で戻すのがダサい。
もっと言うと`then`のときに`foo`が再度`subscribe`されてしまうため、正確には次のように書くほうが良い。

``` java
Mono<Foo> foo = request.bodyToMono(Foo.class).cache();
Mono<Foo> saved = foo.flatMap(fooService::save).then(foo);
```

イマイチなので、次のように書くとCool。


``` java
Mono<Foo> foo = request.bodyToMono(Foo.class);
Mono<Foo> saved = foo.delayUntil(fooService::save);
```
