RxJava2での変更点
RxJava2.xのリリースが近いということで、What's different in 2.0を元に1.xとの主な変更点を解説しようと思います。
執筆時点でバージョンは2.0.0-RC2です。
バージョンアップで変更点あれば追記するかもしれません。
パッケージ名の変更
RxJava 2.xは、ReactiveStreamに準拠するため、インタフェース名などが大きく変更されています。(例: Subscription -> Disposable など)
そのため、別パッケージによる提供となっています。
1.x |
2.x |
|
|---|---|---|
| Dependency notation | io.reactivex:rxjava:1.x.y |
io.reactivex.rxjava2:rxjava:2.x.y |
| Java base package | rx |
io.reactivex |
Null非許容
onNext(null)はNullPointerExceptionが発生するようになります。
Observable.just(null);
BehaviorSubject.createDefault<String>(null);
behaviorSubject.onNext(null);
APIのレスポンスボディが空という意味でnullを返している場合は、Completableを使うべきです。
状態としてNull許容のBehaviorSubjectを使用しているような場合は、代替手段がないので致命的かもしれません。
ObservableとFlowable
1.xまではBackpressureはObservableに実装されていましたが、BackpressureなしがObservable、ありがFlowableとインターフェースが変わります。
Observable.create<Int>(emitter -> emitter.onNext(1));
Flowable.create<Int>(emitter -> emitter.onNext(1), FlowableEmitter.BackpressureMode.LATEST);
Backpressureを今まで意識していなかった場合は問題なさそうですが、使用している場合は、Flowableに変更する必要があります。
Single
onSuccessかonErrorのどちらかが一度だけ呼ばれます。onCompletedは呼ばれなくなります。
Completable
onCompleteかonErrorのどちらかが一度だけ呼ばれます。
Maybe
SingleとCompletableを合わせたようなものです。onSuccessかonCompleteかonErrorのいずれかが一度だけ呼ばれます。
SubjectとProcessor
ObservableとFlowable同様に、BackpressureなしがSubject、ありがProcessorとなります。
関数型インタフェース
RxJavaで定義されていた各種関数型インターフェースがほとんど変更されます。
基本的にラムダを使用していればあまり影響はないはずです。
各種インターフェースメソッドにthrows Exceptionが付与されているため、無駄なtry-catchも減らせるでしょう。
1.x |
2.x |
|---|---|
Action0 |
Action |
Action1 |
Consumer |
Action2 |
BiConsumer |
ActionN |
Consumer<Object[]> |
Func0 |
削除? |
Func1 |
Function |
Func2 |
BiFunction |
Func3-9 |
Function3-9 |
FuncN |
Function<Object[], R> |
Func1<T, Boolean> |
Predicate |
以下のように、関数型インターフェースのメソッド名も微妙に異なっています。
| Interface name | Method name |
|---|---|
Action |
run |
Consumer |
accept |
Function |
apply |
Predicate |
test |
またScheduler周りの関数型インターフェースは、Runnableが使われるようです。
Subscriber
ReactiveStream準拠により、subscribe()まわりもインターフェースが変更されています。
subscribe(Observer)とsubscribe(Subscriber)を使用していた場合は、特に注意が必要です。
まず、Observable#subscribe(Observer)とFlowable#subscribe(Subscriber)と別れました。
そして、どちらもvoidメソッドになっています。
これをdispose(1.xではunsubscribe)するには、ObserverとSubscriber自体にその実装をし、外部からdisposeしなくてはなりません。
また、onCompletedからonComplete、onStartからonSubscribeに変更されています。
ラムダのsubscribe(onNext, onError, onComplete, onSubscribe)を使用している場合は、大きな影響はなさそうです。
Subscription
SubscriptionからDisposableに変更されています。
1.x |
2.x |
|---|---|
Subscription |
Disposable |
isUnsubscribed() |
isDisposed() |
unsubscribe() |
dispose() |
CompositeSubscription |
CompositeDisposable |
Scheduler
Schedulers.test()が削除されたので、new TestScheduler()を使うようにしなくてはなりません。
Schedulerを自作する際に、Workerが廃止されたようです。(よく忘れられるから?)
自作していないかぎりあまり影響はないでしょう。
Operatorの変更点
https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#1x-observable-to-2x-flowable
オーバーロードメソッドへの統合や、新規追加など、かなり変更点があります。
Operatorの自作
https://github.com/ReactiveX/RxJava/wiki/Writing-operators-for-2.0
1.xに比べると10倍ほど作るのが難しいらしい。
Observable#liftで使われるObservableOperatorのソース見た感じ、Upstream/Downstreamのつなぎを全部書かないといけないようです。
ObservableOperatorを実装したユーティリティ系クラスもなさそう。
まとめ
- 移行は簡単じゃない
- ラムダ使ってない場合は、まずラムダに置換してから移行
- Operatorの移行が大変そう
- 個人的にこういうライブラリ作ってたので、null非許容つらい・・