Come creare un metodo Java che accetta un numero variabile di argomenti?

Ad esempio, il proprio String.format() Java supporta un numero variabile di argomenti.

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

Come posso creare la mia funzione che accetta un numero variabile di argomenti?


Domanda di follow-up:

Sto davvero cercando di fare una scorciatoia di convenienza per questo:

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

In modo che io possa chiamarlo qualcosa di meno verboso come questo:

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

Come posso raggiungere questo objective?

Potresti scrivere un metodo di convenienza:

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

Ma come puoi vedere, hai semplicemente ribattezzato il format (o printf ).

Ecco come potresti 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 

Nota c'è anche il metodo System.out.printf simile che si comporta allo stesso modo, ma se si dà un'occhiata all'implementazione, printf chiama solo il format , quindi si potrebbe anche usare direttamente il format .

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

Questo è noto come varargs vedi il link qui per maggiori dettagli

Nelle versioni java precedenti, un metodo che richiedeva un numero arbitrario di valori richiedeva la creazione di un array e inserisce i valori nell’array prima di richiamare il metodo. Ad esempio, ecco come è stata utilizzata la class MessageFormat per formattare un messaggio:

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

È ancora vero che più argomenti devono essere passati in un array, ma la funzione varargs automatizza e nasconde il processo. Inoltre, è compatibile con le API preesistenti. Ad esempio, il metodo MessageFormat.format ora ha questa dichiarazione:

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

Dai un’occhiata alla guida Java su varargs .

È ansible creare un metodo come mostrato di seguito. Basta chiamare System.out.printf invece di System.out.println(String.format(...

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

In alternativa, puoi semplicemente usare un’importazione statica se vuoi digitare il meno ansible. Quindi non devi creare il tuo metodo:

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

Questa è solo un’estensione delle risposte sopra fornite.

  1. Ci può essere solo un argomento variabile nel metodo.
  2. L’argomento variabile (vararg) deve essere l’ultimo argomento.

Chiaramente spiegato qui e le regole da seguire per utilizzare l’ argomento variabile .

Quanto segue creerà un set di argomenti di lunghezza variabile del tipo di stringa:

 print(String arg1, String... arg2) 

È quindi ansible fare riferimento a arg2 come array di stringhe. Questa è una nuova funzionalità di Java 5.

Gli argomenti variabili devono essere l’ultimo dei parametri specificati nella dichiarazione della funzione. Se provi a specificare un altro parametro dopo gli argomenti delle variabili, il compilatore si lamenterà poiché non c’è modo di determinare quanti dei parametri effettivamente appartengono all’argomento della variabile.

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

È ansible passare tutti i valori di tipo simili nella funzione durante la chiamata. Nella definizione della funzione metti un array in modo che tutti i valori passati possano essere raccolti in quell’array . per esempio .

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