RxJava 3.xの開発が本格的に始まりました

現状での差異をまとめておきます。

RxJava2との差異

READMEから

README.md

RxJava2 との差分は以下のようになっています。

3.x different docsから

3.x different docs

asメソッドとtoメソッド

toメソッドはFunction型を引数から取っていた。しかし、あらゆるReactive型でFunction型を受け取っていたので、共通のConverterを作ることが出来なかった。

// Obsevable.java
public final <R> R to(Function<? super Observable<T>, R> converter)

// Single.java
public final <R> R to(Function<? super Single<T>, R> convert

同じFunction型を引数に取るので、共通のクラスを作ることが出来ない。

→ そこで、asメソッドが誕生

asメソッドでは、CompletableConverter、ObservableConverterなど、専用のインターフェース型が定義され、1つのクラスに実装できるようになりました。

// Observable.java
public final <R> R to(@NonNull ObservableConverter<T, ? extends R> converter)

// Single.java
public final <R> R to(@NonNull SingleConverter<T, ? extends R> converter) {

→ autodisposeみたいな、ライブラリを作るときに便利

従来のtoメソッドは消えて、RxJava 3ではasに統合された。(メソッド名はtoです)

Functional typesがThrowableをthrowするようになった

今まではFunctional typesとして、Callableインターフェースを使っていました。

@FunctionalInterface
public interface Callable<V> {
    /**
      * Computes a result, or throws an exception if unable to do so.
      *
      * @return computed result
      * @throws Exception if unable to compute a result
      */
    V call() throws Exception;
}

これからは、Supplierインターフェースを使うようになります。

public interface Supplier<T> {

    /**
     * Produces a value or throws an exception.
     * @return the value produced
     * @throws Throwable if the implementation wishes to throw any type of exception
     */
    T get() throws Throwable;
}

throwする例外がException -> Throwableに広がりました。

ちなみに、lambda式を使っている場合は変更するコードを必要がないかもしれません。

// before
source.to(flowable -> flowable.blockingFirst());

// after
source.to(flowable -> flowable.blockingFirst());

startWithメソッド

startWith(T)、startWith(Iterable)、 startWith(Publish)の同名で3つのメソッドがありましたが、 startWithItem、startWithIterableにそれぞれリネームされました。

メモ・その他

追記

Written by
あんどろいどでぃべろっぱぁー🍎