RxJava2での変更点

RxJava2での変更点
===
[RxJava2.x](https://github.com/ReactiveX/RxJava/tree/2.x)のリリースが近いということで、[What's different in 2.0](https://github.com/ReactiveX/RxJava/wiki/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`が発生するようになります。

```java
Observable.just(null);
BehaviorSubject.createDefault<String>(null);
behaviorSubject.onNext(null);
```

APIのレスポンスボディが空という意味で`null`を返している場合は、`Completable`を使うべきです。
状態としてNull許容の`BehaviorSubject`を使用しているような場合は、代替手段がないので致命的かもしれません。


ObservableとFlowable
---
`1.x`まではBackpressureは`Observable`に実装されていましたが、Backpressureなしが`Observable`、ありが`Flowable`とインターフェースが変わります。

```java
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`の[ソース](https://github.com/ReactiveX/RxJava/blob/2.x/src/main/java/io/reactivex/ObservableOperator.java)見た感じ、Upstream/Downstreamのつなぎを全部書かないといけないようです。
`ObservableOperator`を実装したユーティリティ系クラスもなさそう。


まとめ
===
* 移行は簡単じゃない
* ラムダ使ってない場合は、まずラムダに置換してから移行
* Operatorの移行が大変そう
* 個人的に[こういうライブラリ](https://github.com/kubode/RxProperty)作ってたので、null非許容つらい・・


参考
---
* [RxJavaがもうすぐ2.0になる話](http://qiita.com/kazy/items/a37fa4a3b300071a6996)