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非許容つらい・・