はじめに
せっかくJava8の時に書いたので、Java9での追加要素についてまとめたページ
そんなに難しい機能じゃないので、もうすでにある記事で問題ない気もしますが、勉強なので気にしないことにします。
Java8の時に書いた記事はこちらにあります。
JavaDoc
ifPresentの追加要素
ifPresentOrElseが今回追加されています。
Java8の時にあったifPresentのFalseケースが一つのメソッドで完結することが出来るようになりました。
Optional<String> optional = Optional.ofNullable("");
Optional<String> optional2 =Optional.ofNullable(null);
optional.ifPresentOrElse(t -> System.out.println(true), () -> System.out.println(false));
optional2.ifPresentOrElse(t -> System.out.println(true), () -> System.out.println(false));
結果:
true
false
streamの追加
今回からOptinalクラスを直接streamに書き換えることが可能となりました。
Optional.ofNullable(null).stream().forEach(System.out::println);
結果:
nullの場合はObject型にしないと型が分からないので注意が必要です。
※キャストして明示するなりすれば大丈夫なことをコメントで指摘いただいたので追記しました
OK List<Object> optional = Optional.ofNullable(null).stream().collect(Collectors.toList());
OK List<String> optional = Optional.ofNullable((String)null).stream().collect(Collectors.toList());
NG List<String> optional = Optional.ofNullable(null).stream().collect(Collectors.toList());
List型をうまくStreamに変換する場合は、flatmapでStreamに変換してあげる必要があります。
List<String> list = List.of("aaa", "bbb");
List<String> list2 = null;
Optional.ofNullable(list).stream().flatMap(t -> t.stream()).forEach(System.out::println);
Optional.ofNullable(list2).stream().flatMap(t -> t.stream()).forEach(System.out::println);
結果:
aaa
bbb
mapだとStream型にまでしかしてくれないので、基本的にflatmapを使う必要があります。
mapで頑張りたいあなたにと思ってStreamからStringを簡単に変換する方法を軽く探しましたが、よくわかりませんでした。
flatmapの実装見ても、こちらでわざわざ実装するべきだとは思いませんでした。
素直に使いましょう。
orメソッドの追加
値が存在する場合は何もせず、Nullの場合にのみ実行するメソッドです。
返却値がOptional<T>なので、Nullの場合の代用変数を宣言するようなイメージでしょうか。
少し複雑な条件を記述したくなっても、orを使うことで簡潔に表現することが可能となりそうです。
System.out.println(Optional.ofNullable("aaa").or(() -> Optional.of("bbb")).get());
System.out.println(Optional.ofNullable(null).or(() -> Optional.of("bbb")).get());
結果:
aaa
bbb
おわりに
JavaDoc見た感じはこの3つの機能が追加されたようです。
面倒くさかったのでリリースノートとか見なかったので、他にあったら追記します。