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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

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

我怎样才能做到这一点?

提问于
用户回答回答于

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

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直接使用。

用户回答回答于

这被称为可变参数查看链接在这里的更多细节

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

扫码关注云+社区