3 votes

Consommateur avec varargues

Suggérer ce qui suit :

  Consumer<Object[]> consumer = (args) -> { /* Do something */ }

Pour utiliser le consommateur, je dois créer un tableau d'objets. Donc, je dois écrire quelque chose comme

  consumer.accept(new Object[]{ object0, object1, ... });

Évidemment, je préférerais avoir quelque chose comme

  Consumer<Object...> consumer = (args) -> { /* Do something */ }
  consumer.accept(object0, object1, ...);

Une telle chose est-elle possible ?

2voto

Paramètre d'arité variable ( varargs ) est un élément syntaxique, un jeton spécial indiquant qu'une méthode ( ou un constructeur ) attend 0 ou plusieurs arguments de ce type. Et ces arguments seront enveloppés par un tableau ( de sorte que techniquement ils constitueront un seul argument ) lorsque la méthode est exécutée.

Son usage est limité : une méthode ne peut avoir qu'un seul paramètre d'arité variable et il doit être défini en dernière position.

Le paramètre d'arité variable n'est pas un type en soi. Si vous essayez d'utiliser éclipses ... n'importe où, sauf à la dernière position de la déclaration d'une méthode (constructeur), vous obtiendrez une erreur de compilation ( Jetez un coup d'œil à JLS pour plus d'informations ).

Afin d'utiliser un nombre variable d'arguments dans une fonction, vous pouvez définir une fonction interface fonctionnelle avec une méthode d'arité variable. Et cette méthode est le seul endroit où les ellipses ... doit être utilisé.

@FunctionalInterface
public interface MyConsumer<T> {
    void accept(T... items);
}

MyConsumer<String> myConsumer = items -> Stream.of(items).forEach(System.out::println);

myConsumer.accept("A", "B", "C");

Donne une sortie :

A
B
C

2voto

WJS Points 22153

Mais vous pouvez créer votre propre interface fonctionnelle comme suit :

interface IntVarArgsConsumer {
        void accept(int ...s);
}

IntVarArgsConsumer printArray = arr-> System.out.println(Arrays.toString(arr));

printArray.accept(1,2,3,4,5);
printArray.accept(1,2,3);

imprime

[1, 2, 3, 4, 5]
[1, 2, 3]

Mais je vous mets en garde no pour mélanger generic type parameters y varargs . Sinon, vous pouvez polluer le tas et obtenir ClassCastExceptions . Si vous voulez juste traiter Strings puis utilisez le String type. Si Objects utilisez le Object type. Mais pas n'importe quel type R comme vous pouvez le voir dans d'autres méthodes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X