Java の可変引数関数

Nov 20, 2024 am 01:00 AM

Funciones variádicas en Java

可変個引数関数は、不特定の数のパラメーターを受け入れる関数です。

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? 会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? Apr 19, 2025 pm 04:51 PM

一部のアプリケーションが適切に機能しないようにする会社のセキュリティソフトウェアのトラブルシューティングとソリューション。多くの企業は、内部ネットワークセキュリティを確保するためにセキュリティソフトウェアを展開します。 ...

MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? Apr 19, 2025 pm 06:21 PM

システムドッキングでのフィールドマッピング処理は、システムドッキングを実行する際に難しい問題に遭遇することがよくあります。システムのインターフェイスフィールドを効果的にマッピングする方法A ...

エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? Apr 19, 2025 pm 11:42 PM

データベース操作にMyBatis-Plusまたはその他のORMフレームワークを使用する場合、エンティティクラスの属性名に基づいてクエリ条件を構築する必要があることがよくあります。あなたが毎回手動で...

名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? 名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? Apr 19, 2025 pm 11:30 PM

多くのアプリケーションシナリオでソートを実装するために名前を数値に変換するソリューションでは、ユーザーはグループ、特に1つでソートする必要がある場合があります...

Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Apr 19, 2025 pm 11:45 PM

intellijideaultimatiateバージョンを使用してスプリングを開始します...

Javaオブジェクトを配列に安全に変換する方法は? Javaオブジェクトを配列に安全に変換する方法は? Apr 19, 2025 pm 11:33 PM

Javaオブジェクトと配列の変換:リスクの詳細な議論と鋳造タイプ変換の正しい方法多くのJava初心者は、オブジェクトのアレイへの変換に遭遇します...

eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? Apr 19, 2025 pm 11:27 PM

eコマースプラットフォーム上のSKUおよびSPUテーブルの設計の詳細な説明この記事では、eコマースプラットフォームでのSKUとSPUのデータベース設計の問題、特にユーザー定義の販売を扱う方法について説明します。

データベースクエリにTKMYBATISを使用するときに、エンティティクラスの変数名の構築クエリ条件をエレガントに取得する方法は? データベースクエリにTKMYBATISを使用するときに、エンティティクラスの変数名の構築クエリ条件をエレガントに取得する方法は? Apr 19, 2025 pm 09:51 PM

データベースクエリにTKMYBATISを使用する場合、クエリ条件を構築するためにエンティティクラスの変数名を優雅に取得する方法は一般的な問題です。この記事はピン留めします...

See all articles