Help us understand the problem. What is going on with this article?

Java9でのOptionalクラスの追加要素をまとめる

More than 3 years have passed since last update.

はじめに

せっかくJava8の時に書いたので、Java9での追加要素についてまとめたページ
そんなに難しい機能じゃないので、もうすでにある記事で問題ない気もしますが、勉強なので気にしないことにします。

Java8の時に書いた記事はこちらにあります。

JavaDoc

http://download.java.net/java/jdk9/docs/api/java/util/Optional.html

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つの機能が追加されたようです。
面倒くさかったのでリリースノートとか見なかったので、他にあったら追記します。

tasogarei
元々Java屋さんでしたがRailsはじめました。 と思ったらPython書いたりもしてます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away