Empty Monoの処理方法
Reactorプログラミングでは、empty
reactorに変えるとこうなるかもしれません
上記の例示的なコードの注釈は、
では、どうすればいいですか.Java 8の
Mono
に対して特定のビジネスロジックを行う必要がある場合があります.reactorでプログラミングされていないコードを見てみましょう.public void oldCheck(Token token) {
if (token == null) {
// business logic
return;
}
if (token.isExpired) {
// business logic
return;
}
// business logic
return;
}
reactorに変えるとこうなるかもしれません
public Mono badCheck(Mono tokenMono) {
return tokenMono
.flatMap(token -> {
if (token == null) {
// CAUTION: You will never be in here
// business logic
return Mono.empty();
}
if (token.isExpired) {
// business logic
return Mono.empty();
}
// business logic
return Mono.empty();
});
}
上記の例示的なコードの注釈は、
if (token == null) {}
がemptyである場合、Mono
がトリガされないため、flatMap
と書かれている.flatMap
のようなほとんどのOperatorは、Publisher
(Mono
およびFlux
はPubisher
)のプッシュデータに依存しており(詳細はjavadocを参照)、Publisher
自体にデータがプッシュできない場合、Operatorはトリガーされません.言い換えればflatMap
内部でnullを得ることは不可能である.では、どうすればいいですか.Java 8の
Optional
を中間値として使用できます.public Mono goodCheck(Mono tokenMono) {
return tokenMono
// Transform Mono to Mono>.
// If Mono is empty, flatMap will not be triggered,
// then we will get a empty Mono>
.flatMap(token -> Mono.just(Optional.of(token)))
// If Mono> is empty, provide an empty Optional,
// then we will get a non-empty Mono> anyway
.defaultIfEmpty(Optional.empty())
// Since Mono> is not empty, flatMap will always be triggered.
.flatMap(tokenOptional -> {
if (!tokenOptional.isPresent()) {
// business logic
return Mono.empty();
}
Token token = tokenOptional.get();
if (token.isExpired) {
// business logic
return Mono.empty();
}
// business logic
return Mono.empty();
});
}
defaultIfEmpty
に加えて、Reactorは、empty switchIfEmpty
/repeatWhenEmpty
を処理するためにMono
、Flux
を提供する.