0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-08

はじめに

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

0
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?