Java
Android
RxJava

RxJavaで謎のNoSuchElementExceptionに苦しめられた話

tl(というほどLじゃないけど);dr

RxJavaを使っていて、subscribe()やonComplete()を呼んでいる行でNoSuchElementExceptionが出た時は、flatMapSingleElement()を使うべき場合がある

kwsk

MaybeからSingleにつなぐ時に、flatMapSingle()じゃなくてflatMapSingleElement()を使わないとNoSuchElementExceptionが発生する事があるよって話。

例外のスタックトレース追ってもよくわからん行番号しか教えてくれない時に疑うべき部分として、RxJavaの使い方を見直してみようねという話。

Completeが流れる可能性のあるストリームにSingleをつなぐとき、コンパイルエラーもエラーログもIDEの警告もなんも出ないけど、おかしなことをやっていることを我々は自覚できないといけない。
最悪、プログラムがお亡くなりになる可能性があるわけだし。
普通にFlowableにSingleにつなぐぶんには、RxJavaがよしなにやってくれたりするのだけど。
そもそもCompletableにはSingleつなげなかったりするしね。

余談

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