うさがにっき

読書感想文とプログラムのこと書いてきます

Retrolamda, RxAndroidを使ったJava8っぽいAndroidコーディングはへっぽこアンドロイダーにも恩恵をもたらすのか?(RxAndroidを使ったoptional編)

概要

tiro105.hateblo.jp
の続き

sys1yagi.hatenablog.com
を参考にAndroidでoptionalを使えるようにしていく
…の前にOptionalとは?について説明していく

詳細

Optionalとは?

Java8で実装された、nullかもしれない値を表現するためのラッパークラス

getHogeがnullを返す可能性があるとする
Java8以前のコードであれば、以下のようなコードとなる

String hoge = getHoge();

if (hoge != null) {
    System.out.println(hoge.length());
} 

これをOptionalを使うと以下のように表現される

Optional<String> hogeOpt = Optional.ofNullable(getHoge());
hogeOpt.ifPresent(hoge -> System.out.println(hoge.length()));

Optionalを使うことにより、nullチェックが必要なくなっている
nullチェックが必要なくなるだけでなくOptionalにはnullかもしれない値を扱う際に便利なメソッドが色々揃っている
これを使えばNullPointerExceptionが発生することが格段に少なくなる

Optional.of, Optional.ofNullable

Optionalインスタンスを作成するときに使う

  • Optional.of

nullがパラメータとなった場合nullPointerExceptionを投げる
つまりこのメソッドを使って作られたOptionalはnullじゃないことが保証される

  • Optional.ofNullable

nullもパラメータとして許容する
つまりこのメソッドを使って作られたOptionalはnullかもしれない

ifPresent, map

Optionalオブジェクトに対してnullじゃない場合だけ、処理を行う

  • ifPresent

値を返さない処理を扱う

optionalHoge.ifPresent(hoge -> System.out.println(hoge.length()));
  • map

Optional型の値を返す処理を扱う
Optionalの中身がない場合、空のOptionalを返す

Optional<Integer> integerOpt = optionalHoge.map(hoge -> hoge.length());
flatMap

二つのOptionalが値を持っている場合のみ、値を返したいときに使う
mapと違うのは戻り値を自分でOptionalにする必要が有る

Optional<String> opt1 = getHogeOpt(); 
Optional<String> opt2 = getHogeOpt(); 

Optional<String> opt3 = opt1.flatMap(str1 ->      
        opt2.flatMap(str2 -> {                    
            return Optional.ofNullable(str1 + str2);      
        }));
filter

条件に合致する場合には自分自身を返し、条件に合わない場合は空のOptionalを返す
もちろんからのOptionalだった場合はも空のOptionalを返す

Optional<String> hogeOpt = Optional.ofNullable(getHoge());
Optional<String> filteredOpt = hogeOpt.filter(hoge -> hoge.length() >= 2);
Optionalから値を取り出す

orElseかorElseGetを使う
orElseのパラメータにはOptionalが空の場合のデフォルト値を設定する
orElseGetのパラメータにもデフォルト値を設定するが、Supplier型のラムダ式で渡す。

Supplier型
Supplier (Java Platform SE 8 )
ざっくり言うと大きなオブジェクトを必要なときのみ生成してくれる的な仕組み

Optional<String> hogeOpt = Optional.ofNullable(getHoge());

String hoge = hogeOpt.orElse("デフォルト値");
String hoge2 = hogeOpt.orElseGet(() -> "生成コストの高いデフォルト値");

Optionalを使うことによりオブジェクトがNullであるかもしれないということが伝わる
これによりNullPointerExceptionを減らしていけるのではなかろうか

次回はJava8が導入されていないAndroid環境にObservableを使ってOptionalを実装する方法を書く
と思ったけど以下の記事見れば後はわかるのでおまかせで
RxJavaのObservable<T>でOptional<T>を代行する - visible true