単一の要素を選択します
直感的には、複数の要素を選択するよりも 1 つの要素を選択する方が確実に簡単ですが、ここにはいくつかの問題があります。まず一般的なアプローチで何が問題なのかを見てから、それを解決するためにラムダ式を使用する方法を見てみましょう。
まず、特定の文字で始まる要素を検索する新しいメソッドを作成し、それを出力しましょう。
次のようにコードをコピーします。
public static void pickName(
Final List<String> 名、final String startingLetter) {
文字列見つかった名前 = null;
for(文字列名 : 名前) {
if(name.startsWith(startingLetter)) {
foundName = 名前;
壊す;
}
}
この方法は、ちょうど通り過ぎたゴミ収集車と同じくらい臭いです。まず新しい foundName 変数を作成し、それを null に初期化しました。これが悪臭の原因です。 null かどうかを確認する必要があります。そうでない場合は、NullPointerException またはエラー応答がスローされます。また、外部イテレータを使用してリストをループします。必要な要素が見つかったら、ループから抜け出す必要があります。これにより、基本的なパラノイア、命令型スタイル、可変性がすべて生き生きとします。ループを終了したら、印刷する前に結果を確認する必要があります。このような小さなタスクでも、実際には非常に長いコードが必要になります。
この問題を再分析してみましょう。最初に一致する要素を選択し、そのような要素が存在しない場合を安全に処理できるようにしたいだけです。この pickName メソッドをラムダ式を使用して書き直してみましょう。
次のようにコードをコピーします。
public static void pickName(
Final List<String> 名、final String startingLetter) {
最終オプション<String> foundName =
名前.stream()
.filter(名前 ->名前.startsWith(startingLetter))
.findFirst();
System.out.println(String.format("%s で始まる名前: %s",
startingLetter, foundName.orElse("名前が見つかりません")));
}
JDK のいくつかの強力な関数により、このコードは非常に簡潔になります。まず、filter メソッドを使用して条件を満たすすべての要素を取得し、次に Stream クラスの findFirst メソッドを使用して、返されたコレクションの最初の要素を選択します。このメソッドは、Java の null 変数の正式に認定されたデオドライザーである Optional オブジェクトを返します。
Optional クラスは非常に便利で、結果が存在するかどうかを心配する必要はありません。これにより、null ポインター例外の問題から解放され、結果が存在しないことがより明確になります。 isPresent() メソッドを通じて、結果が存在するかどうかを知ることができます。結果の値を取得したい場合は、get() メソッドを使用できます。前のコードと同様に、orElse メソッド (このメソッドの名前を聞くとショックを受けるでしょう) を使用してデフォルト値を設定することもできます。
pickName メソッドを検証するために、以前に使用していた friends コレクションを使用します。
次のようにコードをコピーします。
pickName(友達, "N");
pickName(友達, "Z");
このコードは、最初に一致する要素を選択し、見つからない場合はわかりやすいメッセージを出力します。
次のようにコードをコピーします。
Nで始まる名前:ネイト
Zで始まる名前: 名前が見つかりません
findFirst() メソッドと Optinal クラスを組み合わせると、コードの量が減り、見た目も良くなります。しかし、Optional クラスの機能はそれ以上のものです。たとえば、オブジェクトが存在しない場合にデフォルト値を提供するだけでなく、次のように、結果が存在する場合はそれを使用してコードの一部またはラムダ式を実行することもできます。
次のようにコードをコピーします。
foundName.ifPresent(名前 -> System.out.println("Hello " + 名前));
最初に一致する名前を選択する命令型コードと比較して、フローのエレガントな関数スタイルがより良く見えます。しかし、このバージョンのコール フローではやるべきことが多すぎますか?もちろんそうではありません。これらのメソッドは非常にスマートであり、オンデマンドで動作します (これについては、113 ページの「ストリームの遅延評価」で詳しく説明します)。
単一の要素を選択する例では、JDK ライブラリのより強力な機能を示しています。ラムダ式がコレクションに基づいて目的の値を見つける方法を見てみましょう。