Java で配列に null 要素が含まれているかどうかをチェックする方法

JavaBeginner
オンラインで実践に進む

はじめに

この実験では、Java 配列に null 要素が含まれているかどうかをチェックする方法を学びます。null 値の取り扱いは、NullPointerException のような一般的なエラーを防ぐための Java プログラミングの基本的なスキルです。これを達成するために、3 つの異なる方法を探ります。ループを使って配列を反復処理する方法、Stream API の機能を活用する方法、配列内に存在する null 要素の数を数える方法です。この実験の終わりまでに、Java 配列内の null 値を効果的に識別し管理するための実践的なテクニックを身につけることができるようになります。

配列をループして null をチェックする

このステップでは、Java 配列の要素をループして null 値をチェックする方法を学びます。null 値の取り扱いは、一般的なエラーである NullPointerException を防ぐために、Java では非常に重要です。

Java で null 値とは、変数が何らかのオブジェクトを参照していないことを意味します。null である変数のメソッドやフィールドにアクセスしようとすると、NullPointerException が発生し、プログラムがクラッシュします。

配列をループして null 要素をチェックする方法を示すために、簡単な Java プログラムを作成しましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。開いていない場合は、左側のファイルエクスプローラーの project フォルダ内にあります。

  2. 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 でない場合、この行が実行され、要素の値が出力されます。
  3. HelloJava.java ファイルを保存します(Ctrl+S または Cmd+S)。

  4. 次に、修正したプログラムをコンパイルします。WebIDE の下部にあるターミナルを開き、以下のコマンドを実行します。

    javac HelloJava.java
    

    エラーがなければ、コンパイルは成功します。

  5. 最後に、コンパイルしたプログラムを実行します。

    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 要素を見つけて出力するようにしましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。

  2. 既存のコードを以下のコードに置き換えます。

    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." を出力します。
  3. HelloJava.java ファイルを保存します。

  4. ターミナルでプログラムをコンパイルします。

    javac HelloJava.java
    
  5. プログラムを実行します。

    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 要素をカウントし、合計数を出力しましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。

  2. 既存のコードを以下のコードに置き換えます。

    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 要素の最終的なカウント数を出力します。
  3. HelloJava.java ファイルを保存します。

  4. ターミナルでプログラムをコンパイルします。

    javac HelloJava.java
    
  5. プログラムを実行します。

    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 を処理するために、異なるレベルの表現力と効率性を提供します。