Java
Android
RxJava

RxJavaでNoSuchElementExceptionに苦しめられた話

FlowableやMaybeからSingleにつなぐ時にflatMapSingle()を使っていると、NoSuchElementExceptionが発生する事がある。

Completeが流れる可能性のあるストリームにSingleをつなぐとき、実際にCompleteが流れてしまうとSingleで処理できずに例外が飛び、そのままアプリがお亡くなりになる。
普通にFlowableにSingleにつなぐぶんにはRxJavaがよしなにやってくれたりするのだけど。
そもそもCompletableにはSingleつなげなかったりするしね。
でも、flatMapSingle()はお構いなしにつないでしまうので、代わりにflatMapSingleElement()を使う必要がある。
コンパイルエラーもエラーログもIDEの警告もなんも出ないけど、おかしなことをやっていることを我々は自覚できないといけない。

余談

非同期処理をflatMapでつないでつないでつないで行く処理を書いていると、Rxが非同期処理のモナドだなあと感じられて関数型完全に理解した気になれるメリットがあるよね
逆にflatMapとかandThenとかを使っていくことで、そっちを手がかりにモナドを理解できるようになったりしないかな…したらいいな…