¿Cómo crear un método Java que acepte una cantidad variable de argumentos?

Por ejemplo, el propio String.format() Java admite una cantidad variable de argumentos.

 String.format("Hello %s! ABC %d!", "World", 123); //=> Hello World! ABC 123! 

¿Cómo puedo hacer mi propia función que acepta una cantidad variable de argumentos?


Siguiente pregunta:

Realmente estoy tratando de hacer un atajo de conveniencia para esto:

 System.out.println( String.format("...", a, b, c) ); 

Para que pueda llamarlo algo menos detallado como este:

 print("...", a, b, c); 

¿Cómo puedo conseguir esto?

Puede escribir un método de conveniencia:

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

Pero como puede ver, simplemente acaba de renombrar el format (o printf ).

Así es cómo podría usarlo:

 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 

Tenga en cuenta que también existe el método similar System.out.printf que se comporta de la misma manera, pero si echa un vistazo a la implementación, printf simplemente llama al format , por lo que también podría usar el format directamente.

  • Varargs
  • PrintStream#format(String format, Object... args)
  • PrintStream#printf(String format, Object... args)

Esto se conoce como varargs. Vea el enlace aquí para más detalles.

En versiones anteriores de Java, un método que tomaba un número arbitrario de valores requería que usted creara una matriz y colocara los valores en la matriz antes de invocar el método. Por ejemplo, aquí es cómo se usó la clase MessageFormat para formatear un mensaje:

 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); 

Todavía es cierto que se deben pasar múltiples argumentos en una matriz, pero la función varargs automatiza y oculta el proceso. Además, es compatible con las API preexistentes. Entonces, por ejemplo, el método MessageFormat.format ahora tiene esta statement:

 public static String format(String pattern, Object... arguments); 

Eche un vistazo a la guía de Java en varargs .

Puede crear un método como se muestra a continuación. Simplemente llame a System.out.printf lugar de System.out.println(String.format(...

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

Alternativamente, puede usar una importación estática si desea escribir lo menos posible. Entonces no tienes que crear tu propio método:

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

Esto es solo una extensión de las respuestas proporcionadas anteriormente.

  1. Solo puede haber un argumento variable en el método.
  2. El argumento variable (varargs) debe ser el último argumento.

Aquí se explican claramente y las reglas a seguir para usar el Argumento Variable .

Lo siguiente creará un conjunto de argumentos de longitud variable del tipo de cadena:

 print(String arg1, String... arg2) 

A continuación, puede referirse a arg2 como una matriz de cadenas. Esta es una nueva característica en Java 5.

Los argumentos variables deben ser el último de los parámetros especificados en la statement de su función. Si intenta especificar otro parámetro después de los argumentos de la variable, el comstackdor se quejará ya que no hay manera de determinar cuántos de los parámetros realmente pertenecen al argumento de la variable.

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

Puede pasar todos los valores de tipo similares en la función al llamarlo. En la definición de la función, coloque una matriz para que todos los valores pasados ​​se puedan recostackr en esa matriz . p.ej .

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