web-dev-qa-db-fra.com

Comment créer Java qui accepte un nombre variable d'arguments?

Par exemple, la propre String.format() de Java prend en charge un nombre variable d'arguments.

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

Comment puis-je créer ma propre fonction qui accepte un nombre variable d'arguments?


Question de suivi:

J'essaie vraiment de faire un raccourci de commodité pour ceci:

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

Pour que je puisse l'appeler comme quelque chose de moins bavard, comme ceci:

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

Comment puis-je atteindre cet objectif?

67
maček

Vous pouvez écrire une méthode de commodité:

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

Mais comme vous pouvez le constater, vous venez de renommer format (ou printf).

Voici comment vous pouvez l'utiliser:

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

Notez qu'il y a aussi la méthode similaire System.out.printf Qui se comporte de la même manière, mais si vous jetez un œil à l'implémentation, printf appelle simplement format, vous pouvez donc aussi bien utiliser format directement.

112
Nate W.

Ceci est connu comme varargs voir le lien ici pour plus de détails

Dans le passé Java, une méthode qui prenait un nombre arbitraire de valeurs vous obligeait à créer un tableau et à placer ces valeurs dans le tableau avant d'appeler la méthode. Par exemple, voici comment utiliser la classe MessageFormat pour formater un message:

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

Il est toujours vrai que plusieurs arguments doivent être passés dans un tableau, mais la fonctionnalité varargs automatise et masque le processus. De plus, il est compatible avec les API préexistantes. Ainsi, par exemple, la méthode MessageFormat.format a maintenant cette déclaration:

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

Jetez un coup d'œil au Java guide sur varargs .

Vous pouvez créer une méthode comme indiqué ci-dessous. Appelez simplement System.out.printf au lieu de System.out.println(String.format(....

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

Alternativement, vous pouvez simplement utiliser un importation statique si vous voulez taper le moins possible. Ensuite, vous n'avez pas à créer votre propre méthode:

import static Java.lang.System.out;

out.printf("Numer of apples: %d", 10);
9
dogbane

Ceci est juste une extension des réponses fournies ci-dessus.

  1. Il ne peut y avoir qu'un seul argument de variable dans la méthode.
  2. L'argument variable (varargs) doit être le dernier argument.

Clairement expliqué ici et règles à suivre pour utiliser Argument Variable .

4

Ce qui suit va créer un ensemble d'arguments de longueur variable du type de chaîne:

print(String arg1, String... arg2)

Vous pouvez alors vous référer à arg2 comme un tableau de chaînes. Ceci est une nouvelle fonctionnalité de Java 5.

2
Bradley Stacey

Les arguments de variable doivent être le dernier des paramètres spécifiés dans votre déclaration de fonction. Si vous essayez de spécifier un autre paramètre après les arguments de variable, le compilateur se plaindra car il est impossible de déterminer combien de paramètres appartiennent réellement à l'argument de variable.

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