如何创建一个接受可变数量参数的 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);

我怎么才能做到呢?

195092 次浏览

这称为 varargs,请参阅链接 给你了解更多细节

在过去的 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);

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

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,因此您不妨直接使用 format

看一下 Varargs上的 Java 指南。

您可以创建如下所示的方法。只需调用 System.out.printf而不是 System.out.println(String.format(...

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

或者,如果您想要输入尽可能少的内容,您可以只使用 静态输入静态输入。那么你就不必创建自己的方法:

import static java.lang.System.out;


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

下面将创建字符串类型的变长参数集:

print(String arg1, String... arg2)

然后您可以将 arg2作为一个 String 数组来引用。

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

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

这只是对上面提供的答案的一个扩展。

  1. 方法中只能有一个变量参数。
  2. 变量参数(varargs)必须是最后一个参数。

清楚地解释了 给你和使用 变量参数应遵循的规则。

可以在调用函数时传递函数中的所有类似类型值。 在函数 定义中放入一个 数组,这样所有传递的值都可以是 集中在那个数组里。 例如:。 .

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