web-dev-qa-db-ja.com

可変数の引数を受け入れるJavaメソッドを作成する方法は?

たとえば、Java独自のString.format()は、可変数の引数をサポートしています。

String.format("Hello %s! ABC %d!", "World", 123);
//=> Hello World! ABC 123!

可変数の引数を受け入れる独自の関数を作成するにはどうすればよいですか?


フォローアップの質問:

私は本当に便利なショートカットを作成しようとしています:

System.out.println( String.format("...", a, b, c) );

そのため、次のような冗長性の低いものと呼ぶことができます。

print("...", a, b, c);

どうすればこれを達成できますか?

67
maček

便利なメソッドを書くことができます:

public PrintStream print(String format, Object... arguments) {
    return System.out.format(format, arguments);
}

しかし、ご覧のとおり、単にformat(またはprintf)という名前に変更しました。

使用方法は次のとおりです。

private void printScores(Player... players) {
    for (int i = 0; i < players.length; ++i) {
        Player player = players[i];
        String name   = player.getName();
        int    score  = player.getScore();
        // Print name and score followed by a newline
        System.out.format("%s: %d%n", name, score);
    }
}

// Print a single player, 3 players, and all players
printScores(player1);
System.out.println();
printScores(player2, player3, player4);
System.out.println();
printScores(playersArray);

// Output
Abe: 11

Bob: 22
Cal: 33
Dan: 44

Abe: 11
Bob: 22
Cal: 33
Dan: 44

同様に動作する同様のSystem.out.printfメソッドもありますが、実装を覗くと、printfformatを呼び出すだけなので、formatを直接使用することもできます。 。

112
Nate W.

これは可変引数として知られています- here のリンクを参照してください

過去のJavaリリースでは、任意の数の値をとるメソッドでは、メソッドを呼び出す前に配列を作成し、値を配列に入れる必要がありました。たとえば、MessageFormatクラスを使用してメッセージをフォーマットする方法は次のとおりです。

Object[] arguments = {
    new Integer(7),
    new Date(),
    "a disturbance in the Force"
};
    String result = MessageFormat.format(
        "At {1,time} on {1,date}, there was {2} on planet "
         + "{0,number,integer}.", arguments);

複数の引数を配列で渡す必要があることは依然として事実ですが、可変引数機能はプロセスを自動化して非表示にします。さらに、既存のAPIとの上位互換性があります。したがって、たとえば、MessageFormat.formatメソッドには次の宣言があります。

public static String format(String pattern,
                            Object... arguments);
26
Paul Whelan

varargs のJavaガイドをご覧ください。

以下に示すようにメソッドを作成できます。 System.out.printfの代わりにSystem.out.println(String.format(...を呼び出すだけです。

public static void print(String format, Object... args) {
    System.out.printf(format, args);
}

または、できるだけ少なく入力する場合は、 static import を使用するだけです。次に、独自のメソッドを作成する必要はありません。

import static Java.lang.System.out;

out.printf("Numer of apples: %d", 10);
9
dogbane

これは、上記の回答に対する単なる拡張です。

  1. メソッドには変数引数を1つだけ指定できます。
  2. 可変引数(varargs)は最後の引数でなければなりません。

here と使用するルール可変引数を明確に説明しました。

4

以下は、文字列型の引数の可変長セットを作成します。

print(String arg1, String... arg2)

その後、arg2を文字列の配列として参照できます。これはJava 5の新機能です。

2
Bradley Stacey

変数の引数は、関数宣言で指定された最後のパラメーターでなければなりません。変数引数の後に別のパラメータを指定しようとすると、実際に変数引数に属するパラメータの数を判断する方法がないため、コンパイラは文句を言います。

void print(final String format, final String... arguments) {
    System.out.format( format, arguments );
}
0
Izza