Est-il possible de déclarer un tableau en ligne?

617

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

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

Puis-je simplement remplacer cela par une ligne et éviter de déclarer une variable nommée que je ne vais jamais utiliser?

DivideByHero
la source
2
Un IDE qui prend en charge la refactorisation vous permettrait de mettre en ligne des chaînes automatiquement.
Paul McKenzie

Réponses:

945
m(new String[]{"blah", "hey", "yo"});
Draemon
la source
77
Juste pour référence future, ce type de tableau est connu comme un tableau anonyme (car il n'a pas de nom). la recherche de "tableau anonyme java" aurait produit des résultats.
Falaina
2
Cela ressemble au casting. Je pense que c'est comme ça que je vais y penser, donc je n'ai pas à le chercher sur Google une fois par bluemoon, je dois le faire.
ArtOfWarfare
C'est le cas rare où une réponse de code uniquement est totalement acceptable, et en fait, peut-être même préférable.
Max von Hippel
113

Draemon a raison. Vous pouvez également déclarer mque vous prenez des 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
Michael Myers
la source
19
assez belle syntaxe, mais avec cette méthode, vous ne pouvez avoir qu'un seul paramètre de tableau, et ce doit être le dernier. Donc, vous ne pouvez pas faire: void m(String... strs, Integer... intgrs)par exemple.
bluefoot
5
blefoot a raison. Mais vous pouvez le fairevoid m(Integer i, Double d, String... str)
Igor S.
@MichaelMyers Quelle est la signification de(String ... strs)
Kasun Siyambalapitiya
1
@KasunSiyambalapitiya: Cliquez sur le lien dans ma réponse.
Michael Myers
30

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

Arrays.asList(new String[] { "String1", "string2" });
Antonio Carlos
la source
38
vous n'avez en fait pas besoin de créer un tableau, vous pouvez faire simplement:Arrays.asList("string1", "string2", ...)
Elias Dorneles
2
Point peut-être utile: vous ne pouvez pas faire cela avec des primitives. Vous vous retrouverez avec un seul élément Listd' type[]où se typetrouve cette primitive. Par exemple, Arrays.asList([some ints])entraîne un List<int[]>.
Moira
@Antonio Carlos: non, ce n'est pas le cas. Vous pouvez faire appel setau retour Listet cela modifiera le tableau.
Holger
17

Vous pouvez directement écrire le tableau en Java moderne, sans 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 devez vous aligner, vous devrez déclarer le type:

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

ou utilisez des 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 permettront l'initialisation implicite à l' avenir

Mise à jour: réponse Kotlin

Kotlin a rendu le travail avec les tableaux tellement plus facile! Pour la plupart des types, utilisez simplement arrayOfet cela déterminera implicitement le type. Ne passez rien pour les laisser vides.

arrayOf("1", "2", "3") // String
arrayOf(1, 2, 3)       // Int
arrayOf(1, 2, "foo")   // Any 
arrayOf<Int>(1, 2, 3)  // Set explict type
arrayOf<String>()      // Empty String array

Les primitives ont des fonctions utilitaires. Ne passez rien pour les laisser vides.

intArrayOf(1, 2, 3)
charArrayOf()
booleanArrayOf()
longArrayOf()
shortArrayOf()
byteArrayOf()

Si vous en avez déjà un Collectionet que vous souhaitez le convertir en tableau en ligne, utilisez simplement:

collection.toTypedArray()

Si vous devez contraindre un type de tableau, utilisez:

array.toIntArray()
array.toLongArray()
array.toCharArray()
...
Gibolt
la source
Mais vous ne pouvez pas faire doSomething({"blah", "hey", "yo"}), c'est ce que la question initiale demandait.
David DeMar
11

Vous pouvez créer une méthode quelque part

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

alors utilise-le

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

pour un meilleur look.

Mahpooya
la source
3

Je voudrais 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 les 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 venu pour configurer un système de menus. Le "+" suffit pour lui dire de placer cet élément 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 en les liant de manière réfléchie (il existe d'autres alternatives).

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

chaque fois que vous voyez un modèle dans votre code, voyez si vous pouvez le remplacer par quelque chose comme ça, et rappelez-vous toujours à quel point la syntaxe d'initialisation du tableau est succincte!.

Bill K
la source
5
Ce serait également préférable de faire comme varargs. De plus, tous ceux qui aiment taper du code pour le "plaisir" méritent un downvote! Le codage consiste à résoudre de nouveaux problèmes, pas à taper. Oh, attendez, c'est Java ;-)
mjaggard
1
Vous avez raison, quand j'ai écrit cela, je n'avais pas beaucoup utilisé varargs - et j'ai utilisé l'initialisation des tableaux un peu avant que varargs n'existe en java. La partie pour laquelle je préférerais encore les tableaux est que si vous le définissez comme un tableau, vous pouvez en faire une constante en haut du fichier au lieu de données en ligne, et vous pouvez également l'extraire dans un fichier de configuration
Bill K
Soit dit en passant, 8 ans plus tard, je dois dire que je me retrouve maintenant à utiliser des annotations pour faire presque toutes les choses pour lesquelles j'utilisais des tableaux de chaînes initialisés.
Bill K
2

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

ArrayUtils.toArray("elem1","elem2")
Shravan Ramamurthy
la source
C'est une alternative, mais il a des appels fonctionnels supplémentaires s'ajoutant à la pile qui ne sont pas nécessaires.
CybeX
1

Comme le dit Draemon, le plus proche que Java vient des 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 sur le projet Google Espresso4J ou consultez-le ici

Jonathan Weatherhead
la source
9
Juste quelques problèmes ici: 1. Veuillez vous assurer que dans vos messages et votre profil, vous indiquez clairement que vous êtes affilié à Espresso4J (veuillez consulter notre FAQ ) 2. Veuillez faire attention à publier des liens vers votre propre site Web sur des messages assez anciens ( surtout les réponses passe-partout comme celle-ci et celle-ci ) - il se présente comme très spammeux et soulève des drapeaux qui ébranleront votre représentant.
Kev
@Kev ah désolé. J'ai clarifié que je suis le développeur du bon projet Espresso4J maintenant :)
Jonathan Weatherhead