如何创建接受可变数量参数的Java方法?

时间:2011-09-30 07:40:18

标签: java function methods overloading

例如,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);

我怎样才能做到这一点?

7 个答案:

答案 0 :(得分:112)

你可以写一个方便的方法:

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方法行为方式相同,但如果您查看实现,printf只调用format,那么您也可以使用{{1直接。

答案 1 :(得分:25)

这称为varargs,请参阅链接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);

仍然必须在数组中传递多个参数,但varargs功能会自动化并隐藏进程。此外,它与先前存在的API向上兼容。因此,例如,MessageFormat.format方法现在具有此声明:

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

答案 2 :(得分:9)

查看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);

答案 3 :(得分:3)

这只是上述答案的扩展。

  1. 方法中只能有一个变量参数。
  2. 变量参数(varargs)必须是最后一个参数。
  3. 明确解释here以及使用变量参数的规则。

答案 4 :(得分:2)

以下将创建一个变量长度的字符串类型的参数集:

print(String arg1, String... arg2)

然后,您可以将arg2称为字符串数组。这是Java 5中的一项新功能。

答案 5 :(得分:0)

变量参数必须是函数声明中指定的最后一个参数。如果您尝试在变量参数之后指定另一个参数,编译器将会抱怨,因为无法确定有多少参数实际属于变量参数。

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

答案 6 :(得分:-2)

您可以在调用函数时传递函数中的所有类似值。 在函数定义中添加数组,以便在该数组中收集所有传递的值。 例如

static void demo (String ... stringArray) {
  your code goes here where read the array stringArray
}