毎回ちょっと悩むので備忘録として書いておく
まとめ
orElse で空のストリームを返す、というアイデアだけ覚えておけばOK
まとめ
Optional.ofNullable(arr)
.map(Arrays::stream).orElse(Stream.empty())
.forEach(System.out::println);
詳細
やりたいこと
null の可能性がある配列に対してストリーム処理をしたい。
問題
拡張 for 文や Arrays#stream
、Stream#of
は null セーフではない。
でも毎回 null チェックするのは面倒。
for文を使う場合
String[] arr = null;
for (String s : arr) { // ここで NullPointerException
System.out.println(s);
}
Arraysを使う場合
String[] arr = null;
Arrays.stream(arr) // ここで NullPointerException
.forEach(System.out::println);
// Stream#of も内部で Arrays#stream を使っているらしく
Stream.of(arr) // ここで NullPointerException
.forEach(System.out::println);
Optional を使う
-
Arrays#stream
で配列をストリームに変換 - Optional が空のときは
Stream#empty
で空のストリームを返す
Optionalを使う場合
String[] arr = null;
Optional.ofNullable(arr) // この時点で Optional<String[]>
.map(Arrays.stream) // この時点で Optional<Stream<String>>
.orElse(Stream.empty()) // この時点で Stream<String>, 配列の中身のストリーム
.forEach(System.out::println);