Question Un moyen de déclarer un tableau en ligne?


Disons que j'ai une méthode m () qui prend un tableau de chaînes comme argument. Est-ce que je peux juste déclarer ce tableau en ligne quand je fais l'appel? c'est-à-dire au lieu de:

String[] strs = {"blah", "hey", "yo"};
m(strs);

Puis-je simplement remplacer ceci par une ligne, et éviter de déclarer une variable nommée que je n'utiliserai jamais?


498
2017-07-20 14:44


origine


Réponses:


m(new String[]{"blah", "hey", "yo"});

776
2017-07-20 14:48



Draemon est correct. Vous pouvez également déclarer m en prenant Varargs:

void m(String... strs) {
    // strs is seen as a normal String[] inside the method
}

m("blah", "hey", "yo"); // no [] or {} needed; each string is a separate arg here

97
2017-07-20 14:51



Une autre façon de faire cela, si vous voulez que le résultat soit une liste en ligne, vous pouvez le faire comme ceci:

Arrays.asList(new String[] { "String1", "string2" });

21
2017-09-25 19:39



Vous pouvez créer une méthode quelque part

public static <T> T[] toArray(T... ts) {
    return ts;
}

alors utilisez-le

m(toArray("blah", "hey", "yo"));

pour mieux regarder.


5
2017-07-04 10:13



J'aimerais ajouter que la syntaxe d'initialisation du tableau est très succincte et flexible. Je l'utilise beaucoup pour extraire des données de mon code et le placer dans un endroit plus utilisable.

Par exemple, j'ai souvent créé des menus comme celui-ci:

Menu menu=initMenus(menuHandler, new String[]{"File", "+Save", "+Load", "Edit", "+Copy", ...});

Cela me permettrait d'écrire du code pour configurer un système de menu. Le "+" suffit à lui demander de placer cet objet sous l'élément précédent.

Je pourrais le lier à la classe menuHandler soit par une convention de dénomination de méthode en nommant mes méthodes quelque chose comme "menuFile, menuFileSave, menuFileLoad, ..." et les lier de manière réfléchie (il existe d'autres alternatives).

Cette syntaxe permet une définition du menu AMAZINGLY brève et une méthode "initMenus" extrêmement réutilisable. (Pourtant, je ne prend pas la peine de le réutiliser car il est toujours amusant d'écrire et ne prend que quelques minutes + quelques lignes de code).

chaque fois que vous voyez un motif dans votre code, voyez si vous pouvez le remplacer par quelque chose comme ça, et souvenez-vous toujours de la concision de la syntaxe d'initialisation du tableau!


2
2017-07-20 17:57



Vous pouvez directement écrire le tableau dans Java moderne, sans un initialiseur. Votre exemple est maintenant valide. Il est généralement préférable de nommer le paramètre de toute façon.

String[] array = {"blah", "hey", "yo"};

ou

int[] array = {1, 2, 3};

Si vous avoir pour être en ligne, vous devez déclarer le type:

functionCall(new String[]{"blah", "hey", "yo"});

ou utilisez varargs (arguments variables)

void functionCall(String...stringArray) {
    // Becomes a String[] containing any number of items or empty
}

functionCall("blah", "hey", "yo");

Espérons que les développeurs de Java autoriseront l’initialisation implicite dans le avenir


2
2018-02-08 05:55



Comme le dit Draemon, le plus proche que Java arrive aux tableaux en ligne est new String[]{"blah", "hey", "yo"} Cependant, il y a une astuce qui vous permet de faire quelque chose comme

array("blah", "hey", "yo") avec le type déduit automatiquement.

J'ai travaillé sur une API utile pour augmenter le langage Java afin de permettre les tableaux en ligne et les types de collection. Pour plus de détails google projet Espresso4J ou consultez-le ici


1
2017-09-04 16:25



Une autre option consiste à utiliser ArrayUtils.toArray dans org.apache.commons.lang3

ArrayUtils.toArray("elem1","elem2")

0
2018-02-28 15:34