本稿ではRxJavaの2.x系について紹介します。間違っている箇所があればご指摘下さい。
TL;DR
- 2.x系はReactive Streams準拠に作りなおした実装 (Reactive StreamsとReactive Manifestoは別物)
- ついでに1.x系よりもハイパフォーマンスな設計を目指している
- Java 1.8以上を対象としていて、将来的には1.9(JDK9)のFlow APIにも対応する予定がある
- 当分は1.x系と平行して開発していくので、2.x系に急いで乗り換える必要はない(まだ実用段階ではなさそう)
2.x系の開発の動機
Javaの非同期ストリーム処理の実装は、RxJava, Akka Streams and Reactorなどなど複数あります。少し前に、これら非同期ストリーム処理の基盤部分の標準化をしようという動きがあって、Reactive Streamsというプロトコルが生まれました。既にreactive-streamsという実装もあり、最近1.0を迎えています。 RxJavaもReactive Streamsに準拠したかったのですが、そのためにはPublicなインターフェースも変える必要がありました。そこでRxJavaのチームはReactive Streams準拠の別実装を2.x系として作ることになった..というのがどうやら経緯のようです。
ちなみに1.x系をReactive Streamsに変換するRxJavaReactiveStreamsというライブラリもあります。これを使うとReactive Streamsとの相互変換が可能で、Reactive Streamsが用意しているTCK1と呼ばれるテストスイートをパス出来ます。
Flow APIって?
Reactive Streams準拠のAPIがFlowという名前でJava1.9(JDK9)に入るそうです。今のRxJavaの2.x系実装はreactive-streamsに依存していますが、java1.9(JDK9)がリリースされたら、1.9+用にreactive-streamsをFlow APIで置き換えた実装が提供されるそうです。もちろん1.8用にはreactive-streams使った現行の実装も提供され続ける予定はあります。 Flow APIの現状についての詳細はメーリスのやりとりを御覧ください。
Flow APIが使えるようになればRxJavaはオワコン?
どうもそんなことはないようです。Reactive Streams(Flow)自体はとても薄い実装な上、冗長なので何かでラップしたくなるでしょう。特にflatMap, merge, filter, take, zipなどのオペレータも提供されてないし、他の非同期処理ストリームと上手くやり取りが出来ません。なのでユーザーは何かしらの非同期ストリーム系ライブラリ(RxJava Akka..)を使う必要があるのではないかと言うことでした。というかAndroidでJava 1.9(Flow API)はいつ使えるようになるんだろう。。
おわり
ざっくり2.x系について把握できたでしょうか? Java本体にReactive Streamsが取り込まれるのは非常に良い流れだと思います。2.x系がAndroid環境をサポートするかはわかりませんが、どうにか使える未来がくるといいですね! 楽しみに待っていましょう。
関連記事
-
The Technology Compatibility Kit (TCK) is a standard test suite for conformance testing of implementations. ↩