はじめに
この実験では、Java 配列に null 要素が含まれているかどうかをチェックする方法を学びます。null 値の取り扱いは、NullPointerException のような一般的なエラーを防ぐための Java プログラミングの基本的なスキルです。これを達成するために、3 つの異なる方法を探ります。ループを使って配列を反復処理する方法、Stream API の機能を活用する方法、配列内に存在する null 要素の数を数える方法です。この実験の終わりまでに、Java 配列内の null 値を効果的に識別し管理するための実践的なテクニックを身につけることができるようになります。
配列をループして null をチェックする
このステップでは、Java 配列の要素をループして null 値をチェックする方法を学びます。null 値の取り扱いは、一般的なエラーである NullPointerException を防ぐために、Java では非常に重要です。
Java で null 値とは、変数が何らかのオブジェクトを参照していないことを意味します。null である変数のメソッドやフィールドにアクセスしようとすると、NullPointerException が発生し、プログラムがクラッシュします。
配列をループして null 要素をチェックする方法を示すために、簡単な Java プログラムを作成しましょう。
WebIDE エディタで
HelloJava.javaファイルを開きます。開いていない場合は、左側のファイルエクスプローラーのprojectフォルダ内にあります。HelloJava.javaの既存のコードを以下のコードに置き換えます。public class HelloJava { public static void main(String[] args) { String[] names = new String[5]; // Declare an array of Strings with size 5 names[0] = "Alice"; names[1] = "Bob"; names[2] = null; // Assign a null value names[3] = "Charlie"; names[4] = null; // Assign another null value System.out.println("Checking array for null values:"); // Loop through the array for (int i = 0; i < names.length; i++) { // Check if the current element is null if (names[i] == null) { System.out.println("Element at index " + i + " is null."); } else { System.out.println("Element at index " + i + " is: " + names[i]); } } } }このコードの新しい部分を見てみましょう。
String[] names = new String[5];: この行は、5 つのStringオブジェクトを保持できるnamesという名前の配列を宣言します。このようにオブジェクトの配列を作成すると、要素は自動的にnullに初期化されます。names[2] = null;とnames[4] = null;: これらの行では、インデックス 2 と 4 の要素に明示的にnullを割り当てています。for (int i = 0; i < names.length; i++): これは標準的なforループで、配列の最初の要素(インデックス 0)から最後の要素(names.length - 1)まで反復処理します。if (names[i] == null): ループ内で、このif文は現在のインデックスiの要素がnullと等しいかどうかをチェックします。System.out.println("Element at index " + i + " is null.");: 要素がnullの場合、この行が実行されます。System.out.println("Element at index " + i + " is: " + names[i]);: 要素がnullでない場合、この行が実行され、要素の値が出力されます。
HelloJava.javaファイルを保存します(Ctrl+S または Cmd+S)。次に、修正したプログラムをコンパイルします。WebIDE の下部にあるターミナルを開き、以下のコマンドを実行します。
javac HelloJava.javaエラーがなければ、コンパイルは成功します。
最後に、コンパイルしたプログラムを実行します。
java HelloJava次のような出力が表示されるはずです。
Checking array for null values: Element at index 0 is: Alice Element at index 1 is: Bob Element at index 2 is null. Element at index 3 is: Charlie Element at index 4 is null.この出力は、プログラムが配列内の
null要素を正常に識別して報告したことを示しています。
このステップでは、Java 配列を手動でループし、簡単な if 条件を使用して各要素の null 値をチェックする方法を学びました。これは、潜在的な NullPointerException を処理するための基本的なテクニックです。
Stream API を使用して null を検出する
前のステップでは、従来の for ループを使用して配列内の null 値をチェックしました。Java 8 では Stream API が導入され、配列を含むデータのコレクションを処理するための、より関数型で簡潔な方法が提供されます。このステップでは、Stream API を使用して null 要素を検出する方法を学びます。
Stream API を使用すると、宣言的な方法で要素のシーケンスに対して操作を行うことができます。つまり、for ループのように どのように 処理するかではなく、何を するかを記述します。
HelloJava.java プログラムを変更して、Stream API を使用して null 要素を見つけて出力するようにしましょう。
WebIDE エディタで
HelloJava.javaファイルを開きます。既存のコードを以下のコードに置き換えます。
import java.util.Arrays; // Import the Arrays class import java.util.Objects; // Import the Objects class public class HelloJava { public static void main(String[] args) { String[] names = new String[5]; names[0] = "Alice"; names[1] = "Bob"; names[2] = null; names[3] = "Charlie"; names[4] = null; System.out.println("Checking array for null values using Stream API:"); // Convert the array to a Stream Arrays.stream(names) // Filter for null elements .filter(Objects::isNull) // Print each null element (or a message indicating null) .forEach(name -> System.out.println("Found a null element.")); } }新しい部分を解説します。
import java.util.Arrays;:Arraysクラスのstream()メソッドを使用するために、このクラスをインポートする必要があります。import java.util.Objects;: オブジェクトがnullかどうかを簡単にチェックするisNull()メソッドを使用するために、Objectsクラスをインポートします。Arrays.stream(names): この行で、names配列をStringオブジェクトのStreamに変換します。.filter(Objects::isNull): これは中間操作です。Objects.isNull(element)の条件が true となる要素(つまりnullの要素)のみを残すようにストリームをフィルタリングします。Objects::isNullはメソッド参照で、ラムダ式name -> Objects.isNull(name)の省略形です。.forEach(name -> System.out.println("Found a null element."));: これは終端操作です。フィルタリング後に残った各要素(つまりnull要素)に対してアクションを実行します。この場合、見つかった各null要素に対して "Found a null element." を出力します。
HelloJava.javaファイルを保存します。ターミナルでプログラムをコンパイルします。
javac HelloJava.javaプログラムを実行します。
java HelloJava次のような出力が表示されるはずです。
Checking array for null values using Stream API: Found a null element. Found a null element.この出力は、Stream API が配列内の 2 つの
null要素を正常に識別したことを確認しています。ストリームを使用すると、フィルタリングやコレクションの処理などの特定の操作に対して、コードをより読みやすく表現力豊かにすることができます。
null 要素をカウントする
前のステップでは、for ループと Stream API の両方を使用して配列内の null 要素を識別する方法を学びました。時には、null 要素を単に識別するだけでなく、配列内に実際に何個の null 要素があるかを知る必要がある場合があります。このステップでは、Stream API を使用して null 要素の数をカウントする方法を学びます。
Stream API には count() という便利なメソッドがあり、これをストリームに適用すると、そのストリーム内の要素の数を返します。これを前に使用した filter() 操作と組み合わせることで、null 要素のみをカウントすることができます。
HelloJava.java プログラムをもう一度変更して、null 要素をカウントし、合計数を出力しましょう。
WebIDE エディタで
HelloJava.javaファイルを開きます。既存のコードを以下のコードに置き換えます。
import java.util.Arrays; import java.util.Objects; public class HelloJava { public static void main(String[] args) { String[] names = new String[5]; names[0] = "Alice"; names[1] = "Bob"; names[2] = null; names[3] = "Charlie"; names[4] = null; System.out.println("Counting null values using Stream API:"); // Convert the array to a Stream long nullCount = Arrays.stream(names) // Filter for null elements .filter(Objects::isNull) // Count the remaining elements (which are null) .count(); System.out.println("Total number of null elements: " + nullCount); } }新しい部分を説明します。
long nullCount = ... .count();: ストリームをフィルタリングしてnull要素のみを含むようにした後、count()という終端操作を呼び出します。この操作は、フィルタリングされたストリーム内の要素の数をlong値として返し、それをnullCount変数に格納します。System.out.println("Total number of null elements: " + nullCount);: この行は、null要素の最終的なカウント数を出力します。
HelloJava.javaファイルを保存します。ターミナルでプログラムをコンパイルします。
javac HelloJava.javaプログラムを実行します。
java HelloJava次のような出力が表示されるはずです。
Counting null values using Stream API: Total number of null elements: 2この出力は、プログラムが配列内の 2 つの
null要素を正しくカウントしたことを示しています。Stream API のfilter()メソッドとcount()メソッドを組み合わせることは、コレクション内の特定のタイプの要素(null値を含む)をカウントするための効率的で読みやすい方法です。
これで、Java 配列内の null 値を処理する 3 つの異なる方法を学びました。つまり、従来の for ループを使用して各要素をチェックする方法、Stream API を使用して null 要素をフィルタリングして識別する方法、および Stream API を使用して null 要素をフィルタリングしてカウントする方法です。これらのテクニックは、NullPointerException を回避する堅牢な Java コードを書くための基本的なものです。
まとめ
この実験では、異なるアプローチを用いて Java 配列内の null 要素をチェックする方法を学びました。まず、従来のループを実装して配列を反復処理し、if 条件を使用して各要素が null 値かどうかを明示的にチェックしました。この方法は、null を識別する明確で基本的な方法を提供し、配列内の null 処理の基本概念を理解するのに役立ちます。
次に、より近代的で簡潔な null 検出技術を探りました。この実験では、Java Stream API を活用して効率的に null をチェックする方法を示しました。このアプローチでは、ストリーム操作を利用して配列要素を処理し、より関数型のスタイルで null の存在を判断します。最後に、配列内の null 要素の数をカウントする方法を学び、存在する null 値の程度を定量的に把握する方法を得ました。これらの方法は、Java 配列内の null を処理するために、異なるレベルの表現力と効率性を提供します。



