Gibt es eine Möglichkeit, ein Array inline zu deklarieren?

617

Angenommen, ich habe eine Methode m (), die ein Array von Strings als Argument verwendet. Gibt es eine Möglichkeit, dieses Array einfach inline zu deklarieren, wenn ich den Anruf tätige? dh anstelle von:

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

Kann ich dies einfach durch eine Zeile ersetzen und vermeiden, eine benannte Variable zu deklarieren, die ich niemals verwenden werde?

DivideByHero
quelle
2
Mit einer IDE, die das Re-Factoring unterstützt, können Sie Strs automatisch inline schalten.
Paul McKenzie

Antworten:

945
m(new String[]{"blah", "hey", "yo"});
Draemon
quelle
77
Nur zum späteren Nachschlagen wird dieser Array-Typ als anonymes Array bezeichnet (da er keinen Namen hat). Die Suche nach "Anonymous Array Java" hätte zu einigen Ergebnissen geführt.
Falaina
2
Es ähnelt dem Casting. Ich denke, so werde ich es mir vorstellen, damit ich es nicht einmal in einem Bluemoon googeln muss, wenn ich das tun muss.
ArtOfWarfare
Dies ist der seltene Fall, in dem eine Nur-Code-Antwort völlig akzeptabel und vielleicht sogar vorzuziehen ist.
Max von Hippel
113

Draemon ist richtig. Sie können auch deklarieren m, dass Sie varargs nehmen :

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
quelle
19
ziemlich nette Syntax, aber mit dieser Methode können Sie nur einen Array-Parameter haben, und es muss der letzte sein. Das können Sie also nicht tun: void m(String... strs, Integer... intgrs)zum Beispiel.
Bluefoot
5
Blefoot ist richtig. Aber Sie können tunvoid m(Integer i, Double d, String... str)
Igor S.
@ MichaelMyers Was ist die Bedeutung von(String ... strs)
Kasun Siyambalapitiya
1
@ KasunSiyambalapitiya: Klicken Sie auf den Link in meiner Antwort.
Michael Myers
30

Wenn Sie das Ergebnis als Inline-Liste wünschen, können Sie dies folgendermaßen tun:

Arrays.asList(new String[] { "String1", "string2" });
Antonio Carlos
quelle
38
Sie müssen eigentlich kein Array erstellen, Sie können einfach tun:Arrays.asList("string1", "string2", ...)
Elias Dorneles
2
Möglicherweise nützlicher Punkt: Sie können dies nicht mit Grundelementen tun. Sie erhalten ein einzelnes Element, Listin type[]dem angegeben typeist, wo sich dieses Grundelement befindet. zB Arrays.asList([some ints])ergibt a List<int[]>.
Moira
@ Antonio Carlos: Nein, das ist es nicht. Sie können rufen Sie setauf die zurück Listund es wird das Array ändern.
Holger
17

Sie können das Array direkt in modernem Java ohne Initialisierer schreiben. Ihr Beispiel ist jetzt gültig. Es ist im Allgemeinen am besten, den Parameter trotzdem zu benennen.

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

oder

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

Wenn Sie haben , um inline, müssen Sie die Art erklären:

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

oder benutze varargs (variable Argumente)

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

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

Hoffentlich Java-Entwickler werden implizite Initialisierung im erlauben Zukunft

Update: Kotlin Antwort

Kotlin hat die Arbeit mit Arrays so viel einfacher gemacht! Verwenden arrayOfSie für die meisten Typen einfach und es wird implizit der Typ bestimmt. Gib nichts, um sie leer zu lassen.

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

Grundelemente haben Dienstprogrammfunktionen. Gib nichts, um sie leer zu lassen.

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

Wenn Sie bereits eine haben Collectionund diese in ein Inline-Array konvertieren möchten, verwenden Sie einfach:

collection.toTypedArray()

Wenn Sie einen Array-Typ erzwingen müssen, verwenden Sie:

array.toIntArray()
array.toLongArray()
array.toCharArray()
...
Gibolt
quelle
Aber Sie können nicht tun doSomething({"blah", "hey", "yo"}), worum es in der ursprünglichen Frage ging.
David DeMar
11

Sie können irgendwo eine Methode erstellen

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

dann benutze es

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

für einen besseren Blick.

Mahpooya
quelle
3

Ich möchte hinzufügen, dass die Array-Initialisierungssyntax sehr prägnant und flexibel ist. Ich benutze es VIEL, um Daten aus meinem Code zu extrahieren und sie an einem besser verwendbaren Ort zu platzieren.

Als Beispiel habe ich oft Menüs wie diese erstellt:

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

Dies würde es mir ermöglichen, Come-Code zu schreiben, um ein Menüsystem einzurichten. Das "+" reicht aus, um anzugeben, dass das Element unter dem vorherigen Element platziert werden soll.

Ich könnte es entweder durch eine Methodennamenskonvention an die menuHandler-Klasse binden, indem ich meine Methoden wie "menuFile, menuFileSave, menuFileLoad, ..." benenne und sie reflektierend binde (es gibt andere Alternativen).

Diese Syntax ermöglicht eine erstaunlich kurze Menüdefinition und eine äußerst wiederverwendbare "initMenus" -Methode. (Trotzdem mache ich mir nicht die Mühe, es wiederzuverwenden, weil es immer Spaß macht, es zu schreiben und nur ein paar Minuten + ein paar Codezeilen dauert).

Wenn Sie ein Muster in Ihrem Code sehen, prüfen Sie, ob Sie es durch so etwas ersetzen können, und denken Sie immer daran, wie prägnant die Syntax für die Array-Initialisierung ist.

Bill K.
quelle
5
Dies wäre auch als Varargs vorzuziehen. Jeder, der gerne Code zum "Spaß" abtippt, verdient eine Ablehnung! Beim Codieren geht es darum, neue Probleme zu lösen, nicht zu tippen. Oh warte, das ist Java ;-)
mjaggard
1
Sie haben Recht, als ich dies schrieb, hatte ich nicht viel Varargs verwendet - und ich habe die Array-Initialisierung ziemlich oft verwendet, bevor Varargs in Java existierten. Der eine Teil, für den ich Arrays immer noch bevorzugen würde, ist, dass Sie, wenn Sie es als Aray definieren, es anstelle von Inline-Daten zu einer Konstante am Anfang der Datei machen und es auch in eine Konfigurationsdatei extrahieren können
Bill K
Übrigens, 8 Jahre später muss ich sagen, dass ich jetzt Anmerkungen verwende, um fast alle Dinge zu tun, für die ich initialisierte String-Arrays verwendet habe.
Bill K
2

Eine andere Option ist die Verwendung von ArrayUtils.toArray in org.apache.commons.lang3

ArrayUtils.toArray("elem1","elem2")
Shravan Ramamurthy
quelle
Es ist eine Alternative, es werden jedoch zusätzliche Funktionsaufrufe zum Stapel hinzugefügt, die nicht erforderlich sind.
CybeX
1

Wie Draemon sagt, kommt Java Inline-Arrays am nächsten, new String[]{"blah", "hey", "yo"}es gibt jedoch einen netten Trick, mit dem Sie so etwas tun können

array("blah", "hey", "yo") mit dem Typ automatisch abgeleitet.

Ich habe an einer nützlichen API gearbeitet, um die Java-Sprache zu erweitern und Inline-Arrays und Sammlungstypen zu ermöglichen. Für weitere Informationen google project Espresso4J oder schau es dir hier an

Jonathan Weatherhead
quelle
9
Nur ein paar Punkte hier: 1. Bitte stellen Sie sicher, dass Sie in Ihren Posts und Ihrem Profil deutlich machen, dass Sie mit Espresso4J verbunden sind (siehe unsere FAQ ). 2. Bitte seien Sie vorsichtig, wenn Sie Links zu Ihrer eigenen Website auf ziemlich alten Posts veröffentlichen ( Besonders Antworten auf die Kesselplatte wie diese und diese ) - es wirkt sehr spammig und hebt Flaggen, die Ihren Repräsentanten verbeulen.
Kev
@ Kevin ah sorry. Ich habe klargestellt, dass ich jetzt der Entwickler des feinen Espresso4J-Projekts bin :)
Jonathan Weatherhead