streamとfilterの理解をするエントリからはちょっと離れそうだったおまけの記事です。おまけなので短めの記事です。
はじめに
上の記事では、基本的にstreamとfilterの「使い方」を理解するために起こしたエントリでしたが、自分でテストコード書いてて疑問に思って確認した内容をおまけとして書いてます。
- filterした後の確認
- filterした結果、要素がなくなるとどうなる?
filterした後の変数の状態が変わってしまうのでは?や、まったく要素に当てはまらない条件を指定してしまって、filterの結果が0件になった場合にNull Pointer Exceptionが発生するんじゃないか?など考えてしまったので、サンプルコードを使って動作検証してみました。
filterした後の確認
元々のCollection変数はどうなる?
結論から言えば「変化しません」。filter()の戻り値がstreamで定義されていますので、操作されるオブジェクトは別のオブジェクトとなってます。
【サンプルコード】
public class LearningStream { public static void main(String[] args) {// 大文字"K"を含む文字列が設定されている要素のみを扱いたい。
// →「YoKohama」と「Kyoto」がListに残ってほしい要素となります。
String[] strArray = {"YoKohama", "Nagoya", "Osaka", "Kyoto", "kobe"};
List<String> streamLearningList = Arrays.asList(strArray);
streamLearningList.stream()
.filter(x -> (x.indexOf("K") != -1))
.forEach(x -> System.out.println(x));
// streamLearningListの確認
System.out.println("----------");
streamLearningList.stream().forEach(x -> System.out.println(x));
} }
【結果】
YoKohama Kyoto ---------- YoKohama Nagoya Osaka Kyoto kobe
——の上がfilter結果、下が元々のリストの要素となってます。
要素がなくなるとどうなる?
結論から言えば「操作する要素のないオブジェクト」になるだけです。よって、filter後のオブジェクトに対して操作するときは、Null Pointer Exceptionによる例外送出は起きません。
【サンプルコード】
public class LearningStream { public static void main(String[] args) {String[] strArray = {"YoKohama", "Nagoya", "Osaka", "Kyoto", "kobe"};
List<String> streamLearningList = Arrays.asList(strArray);
System.out.println("----------");
streamLearningList.stream()
.filter(x -> (x.length() == 0))
.forEach(x -> System.out.println(x));
System.out.println("----------");
// -----が並ぶだけになる
} }
【結果】
---------- ----------
予想通り、——-が並ぶだけの出力となりました。filter結果をそのままforeachに流し込んでも例外にならないことがわかるだけでも安心して使用できますね。
最後に
変な動作はしないんだよ!
さすがに世界中で使われているような言語で、簡単にNull Pointer Exceptionとかが発生するわけはないだろうとは思っていましたが、予想通り問題なく動作してくれてよかったです。
とはいえ、妄信するのもおっかないので、自身が疑問に思ったことは一通り動作させてみて確認していこうと思った次第です。(準備もそう多くなく、ぱぱっとやれるわけですしね)
ではまた!
コメント