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


70

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

我该如何实现?

Answers:


116

您可以编写一种便捷方法:

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


2
那么这已经实施了吗?我是否应该将其用作PrintStream.print("...", a, b, c)?提供一个使用例子,我将标志着这是公认的答案:)
maček

1
是的,这已经在上提供了PrintStream,它System.out恰好是:D您可以使用printfformat
NateW。11年

@NateW。有何不同private void printScores(Player[] players) {}
Malwinder Singh 2015年

@MS在您的示例中,方法的唯一有效参数将是数组。另一方面,使用vararg参数,数组,单个元素和多个逗号分隔的元素都有效。有更多的方法可以调用它。
Nate W.

26

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

9

看看有关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);

4

这只是上述提供的答案的扩展。

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

此处清楚地解释使用Variable Argument的规则和遵循的规则。


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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.