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

74
例如,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个回答

119

您可以编写一个便利方法:

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方法,它的行为与format方法相同,但如果你查看实现,printf只是调用format,因此你可以直接使用format

2
这个已经被实现了吗?我只需要使用 PrintStream.print("...", a, b, c) 吗?请提供一个使用示例,我会将其标记为接受的答案 :) - maček
1
是的,这已经在PrintStream上提供了,而System.out恰好是其中之一:D 您可以使用printfformat - Nate W.
@NateW。它与private void printScores(Player[] players) {}有何不同? - Malwinder Singh
在你的例子中,该方法的唯一有效参数将是一个数组。另一方面,使用可变参数,数组、单个元素和多个逗号分隔的元素都是有效的。有更多的调用方式。 - Nate W.

26

这被称为可变参数,详细内容请看这里

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

9
请查看关于varargs的Java指南:varargs
您可以创建如下方法。只需调用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);

4

这只是对以上提供的答案的补充。

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

这里清晰地解释了如何使用可变参数并遵循的规则。


2
以下代码将创建一个类型为字符串的可变长度参数集合:
print(String arg1, String... arg2)

你可以将arg2作为字符串数组引用。这是Java 5中的一个新功能。

0
变量参数必须在函数声明中指定为最后一个参数。如果您在变量参数之后尝试指定另一个参数,则编译器会发出警告,因为无法确定有多少参数实际上属于变量参数。
void print(final String format, final String... arguments) {
    System.out.format( format, arguments );
}

-3

在调用函数时,您可以将所有类似类型的值传递给它。 在函数定义中放置一个数组,以便可以收集所有传递的值。 例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接