可変個引数関数は、不特定の数のパラメーターを受け入れる関数です。
Java 内でこれらの関数が使用される理由を見てみましょう。 2 つの整数を受け取り、両方の合計を返す合計メソッドがあるとします。
public static int summation(int a, int b) { return a + b; }
3 つの数値を加算したい場合は、3 つのパラメーターを受け入れるように summation メソッドをオーバーロードする必要があります。
public static int summation(int a, int b, int c) { return a + b + c; }
4 つの数字を追加したい場合はどうなりますか?ここでも、合計メソッドをオーバーロードする必要があります。
public static int summation(int a, int b, int c, int d) { return a + b + c + d; }
ご覧のとおり、これはスケーラブルではありません。異なる数のパラメーターが必要になるたびに、メソッドを再度オーバーロードする必要があるためです。この時点で、整数の配列をパラメータとして渡すことを検討できますが、これは実際のパラメータをラップし、メソッドが新しいデータ型に明示的に依存するようにするだけです。
これらの場合のために、別のタイプの可視構造でラップする必要なく、無限の数のパラメータを受け入れるための 可変個関数 が存在します。 Java の内部的な動作は、可変引数関数に渡されるパラメーターを含む配列の作成であるため、配列のメソッドを操作できることを考慮することが重要です。
可変引数関数は通常の関数と同じ方法で宣言されますが、パラメータとして、その関数が持つ最後のパラメータまたは唯一のパラメータは、データ型...変数名という形式に準拠する必要があります。宣言方法内で変更されるのは、データ型の後ろに 3 つのドットが追加されることだけです。一部の言語では、このタイプのパラメータは varargs として知られています。 summation メソッドが可変個引数関数とどのように似ているかを見てみましょう。
public static int summation(int... numbers) { int sum = 0; for (int number : numbers) { sum += number; } return sum; }
これで、合計メソッドをオーバーロードすることなく、任意の数の数値を追加できるようになりました。ただし、すべての数値が同じデータ型でなければならないという唯一の制限があります。
System.out.println(summation(1, 2)); // 3 System.out.println(summation(1, 2, 3)); // 6 System.out.println(summation(1, 2, 3, 4)); // 10 System.out.println(summation(2, 8, 16, 32, 64, 128, 256, 512, 1024, 2048)); // 4090
Java は内部的に可変個引数関数のパラメーターを配列として処理する、つまり配列内でラップするため、配列のメソッドを操作できるようになると前述しました。たとえば、Arrays クラスの sum メソッドを使用して、summation メソッド内で配列のすべての要素を追加できます。
public static int summation(int... numbers) { return Arrays.stream(numbers).sum(); }
上記のことを考慮すると、どんなに奇妙に思えても、可変個引数関数には、受け入れるデータの型の配列をパラメータとして渡すこともできます。この方法では、配列が引数として直接渡されるため、Java はパラメーターを配列でラップする必要がなくなりました。
public static int summation(int a, int b) { return a + b; }
しかし、可変長関数として宣言されたときにすでに受け取ることができる n 整数に加えて、何らかの理由で加算メソッドが double 型の 2 番目のパラメーターを必要とする場合はどうなるでしょうか。この場合、以下に示すように、必要な追加パラメータと最後に可変引数パラメータまたは varargs を使用して加算メソッドを宣言する必要があります。
public static int summation(int a, int b, int c) { return a + b + c; }
この方法では、最初のパラメータとして double の数値を渡し、追加のパラメータとして追加する整数を渡すことができます。Java は、最初のパラメータが double 型で、次のパラメータが int 型であることを自動的に認識します。パラメータ variadic は、常に関数の最初のパラメータではなく最後のパラメータである必要があります。関数の最初のパラメータではなく、コンパイル エラーが発生するためです。IDE 自体からも次のように指示されます: varargs パラメータは最後のパラメータである必要があります。
public static int summation(int a, int b, int c, int d) { return a + b + c + d; }
結論として、不特定の数のパラメーターを使用して何らかの操作を実行するために何らかのユーティリティ関数が必要で、配列やリストを明示的に渡したくない場合は、可変個引数関数の使用を検討できます。これらは便利で、コードをよりクリーンかつスケーラブルにし、メソッドのオーバーロードを回避します。
以上がJava の可変引数関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。