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

2022-08-31 13:46:37

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

我怎样才能做到这一点?


答案 1

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

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

但正如你所看到的,你只是简单地重命名(或)。formatprintf

以下是使用它的方法:

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.printfprintfformatformat


答案 2

这被称为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);