【问题标题】:How can I create a Java method that accepts a variable number of arguments?如何创建一个接受可变数量参数的 Java 方法?
【发布时间】:2011-11-28 06:31:48
【问题描述】:

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

我怎样才能做到这一点?

【问题讨论】:

    标签: java function methods overloading


    【解决方案1】:

    这称为可变参数,请参阅链接here 了解更多详情

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

    【讨论】:

      【解决方案2】:

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

      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

      【讨论】:

      • 所以这已经实现了?我应该将其用作PrintStream.print("...", a, b, c) 吗?提供一个使用示例,我会将其标记为已接受的答案:)
      • 是的,这已经在PrintStream 上提供,System.out 恰好是 :D 你可以使用printfformat
      • @NateW。它与private void printScores(Player[] players) {} 有何不同?
      • @M.S.在您的示例中,该方法的唯一有效参数是数组。另一方面,对于可变参数,数组、单个元素和多个逗号分隔的元素都是有效的。还有更多的调用方式。
      【解决方案3】:

      查看varargs 上的 Java 指南。

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

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

      或者,如果您想尽可能少地输入,您可以使用static import。然后你不必创建自己的方法:

      import static java.lang.System.out;
      
      out.printf("Numer of apples: %d", 10);
      

      【讨论】:

        【解决方案4】:

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

        print(String arg1, String... arg2)
        

        然后您可以将arg2 称为字符串数组。这是 Java 5 中的一个新特性。

        【讨论】:

          【解决方案5】:

          变量参数必须是函数声明中指定的最后一个参数。如果你试图在变量参数之后指定另一个参数,编译器会报错,因为无法确定有多少参数实际上属于变量参数。

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

          【讨论】:

            【解决方案6】:

            这只是对上述答案的扩展。

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

            清楚地解释了here 和使用变量参数的规则。

            【讨论】:

              【解决方案7】:

              您可以在调用函数时在函数中传递所有相似的类型值。 在函数 definition 中放置一个 array,以便所有传递的值都可以收集到该数组中。 例如 .

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-12-25
                • 1970-01-01
                • 2012-03-10
                • 1970-01-01
                • 2011-08-08
                • 1970-01-01
                • 2014-06-18
                相关资源
                最近更新 更多