【Java】Listの特定値を検索して取得する方法

Java8のstreamを使ってList内を検索してヒットしたら値を取得するというロジックです。

検索してヒットしなかった時(Nullの時)の対応についてもふれていきます。

[スポンサーリンク]

やりたいこと

このロジックをstresmを使って書き換えていきます。

List<String> list = Arrays.asList("AAA", "BBB", "CCC");
String result = null;
for (String str : list) {
    if ("BBB".equals(str)) {
        result = str;
        break;
    }
}
System.out.println(result);

streamを使って特定の値を取得する方法

先程のロジックはstreamを使ってこういう風に書き換えることができます。
上のロジックを比べてみるとだいぶシンプルになりました。

List<String> list = Arrays.asList("AAA", "BBB", "CCC");
Optional<String> result1 = 
        list.stream().filter(s->"BBB".equals(s)).findFirst();
System.out.println("結果は、、、" + result1.get());
>実行結果
結果は、、、BBB

Nullの時は例外が発生します。

上のロジックですが、値が取得できなかった時はNullが発生します。
試しにリスト内には存在しないDDDという文字を検索してみましょう。

List<String> list = Arrays.asList("AAA", "BBB", "CCC");
Optional<String> result2 = 
        list.stream().filter(s->"DDD".equals(s)).findFirst();
System.out.println("結果は、、、" + result2.get());
>実行結果
Exception in thread "main" java.util.NoSuchElementException: No value present
at java.util.Optional.get(Optional.java:135)
at jp.co.example.App.main(App.java:29)

NoSuchElementExceptionが発生しましたね。

次以降ではNullだった時の対応方法を実装していきます。

自作の例外を発生させる

先程は結果がNullの場合はNoSuchElementExceptionが発生しましたが、こちら発生させる例外を指定することができます。
もちろん自作の例外クラスを指定することもできますよ。
例外を指定するには、orElseThrowを使います。

List<String> list = Arrays.asList("AAA", "BBB", "CCC");
Optional<String> result2 = 
        list.stream().filter(s->"DDD".equals(s)).findFirst();
System.out.println("結果は、、、" 
+ result2.orElseThrow(() -> new OriginalException("message")));
>実行結果
Exception in thread "main" jp.co.example.OriginalException: message
at jp.co.example.App.lambda$2(App.java:32)
at java.util.Optional.orElseThrow(Optional.java:290)
at jp.co.example.App.main(App.java:32)

Nullのかわりに値を挿入する

個人的にはあまり使いどころが無いのですが、Nullだった場合に初期値を入れるとかっていう処理には使えそうです。
Nullだった場合の初期値の設定は、orElseを使います。

List<String> list = Arrays.asList("AAA", "BBB", "CCC");
Optional<String> result2 = 
        list.stream().filter(s->"DDD".equals(s)).findFirst();
System.out.println("結果は、、、" 
+ result2.orElse("No"));
>実行結果
結果は、、、No

Optionalについて

上のロジックですが、Nullだった場合の処理についてはOptionalクラスのメソッドを使って色々と対応しています。

Optionalクラスは上で紹介したメソッド以外にもメソッドを持っています。仕様についてはJavadocでの確認をお願いします。(こちらが一番正確です)

今回のサンプルコードで使用したメソッドをまとめておきます。

Optionalで仕様したメソッド
メソッド仕様
get()Nullの場合はNoSuchElementException
orElseThrow()Nullの場合に例外を指定できる
orElse()Nullの場合に代わりの値を挿入できる

Javaのバージョン

今回検証したjavaのバージョンは8です。

さいごに

Listの特定の値を取得する方法ですが、for文を使うよりもstreamの方がコードがスッキリとしていいですね。

for文を使ってもNullチェックは別途作る必要があるので、streamであればNullを考慮したメソッドがすでに用意されているので楽ができてオススメです。

それでは!