Un modo per dichiarare un array in linea?


617

Diciamo che ho un metodo m () che accetta una matrice di stringhe come argomento. C'è un modo in cui posso semplicemente dichiarare questo array in linea quando effettuo la chiamata? cioè invece di:

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

Posso semplicemente sostituirlo con una riga ed evitare di dichiarare una variabile con nome che non userò mai?


2
Un IDE che supporta il re-factoring ti consentirebbe di inserire automaticamente le stringhe.
Paul McKenzie,

Risposte:


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

77
Solo per riferimento futuro, questo tipo di array è noto come array anonimo (in quanto non ha nome). la ricerca di "Java array anonimo" avrebbe prodotto alcuni risultati.
Falaina,

2
Assomiglia al casting. Penso che sia così che ci penserò, quindi non devo cercarlo una volta su un bluemoon, devo farlo.
ArtOfWarfare il

Questo è il raro caso in cui una risposta solo in codice è totalmente accettabile, e in effetti, forse anche preferibile.
Max von Hippel

113

Draemon è corretto. Puoi anche dichiarare mcome prendere 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

19
sintassi piuttosto carina, ma con questo metodo puoi avere solo un parametro array, e deve essere l'ultimo. Quindi, non puoi farlo: void m(String... strs, Integer... intgrs)per esempio.
bluefoot

5
blefoot ha ragione. Ma puoi farlovoid m(Integer i, Double d, String... str)
Igor S.

@MichaelMyers Qual è il significato di(String ... strs)
Kasun Siyambalapitiya

1
@KasunSiyambalapitiya: fai clic sul link nella mia risposta.
Michael Myers

30

Un altro modo per farlo, se vuoi il risultato come Elenco in linea, puoi farlo in questo modo:

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

38
in realtà non è necessario creare un array, si può fare semplicemente:Arrays.asList("string1", "string2", ...)
Elias Dorneles

2
Punto forse utile: non puoi farlo con le primitive. Ti ritroverai con un singolo elemento Listdi type[]dove si typetrova quella primitiva. es. Arrays.asList([some ints])risulta in a List<int[]>.
Moira,

@Antonio Carlos: no, non lo è. È possibile chiamare setil reso Liste questo modificherà l'array.
Holger,

17

È possibile scrivere direttamente l'array nella moderna Java, senza un inizializzatore. Il tuo esempio è ora valido. In genere è meglio nominare il parametro comunque.

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

o

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

Se si dispone di linea, sarà necessario dichiarare il tipo:

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

o usa varargs (argomenti variabili)

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

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

Speriamo che gli sviluppatori Java consentano l'inizializzazione implicita in futuro

Aggiornamento: risposta di Kotlin

Kotlin ha reso molto più semplice lavorare con gli array ! Per la maggior parte dei tipi, basta usare arrayOfe determinerà implicitamente il tipo. Non passare nulla per lasciarli vuoti.

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

I primitivi hanno funzioni di utilità. Non passare nulla per lasciarli vuoti.

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

Se hai già un Collectione desideri convertirlo in un array in linea, usa semplicemente:

collection.toTypedArray()

Se è necessario forzare un tipo di array, utilizzare:

array.toIntArray()
array.toLongArray()
array.toCharArray()
...

Ma non puoi fare doSomething({"blah", "hey", "yo"}), ed è quello che la domanda originale stava ponendo.
David DeMar,

11

Puoi creare un metodo da qualche parte

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

quindi usalo

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

per un aspetto migliore.


3

Vorrei aggiungere che la sintassi di inizializzazione dell'array è molto concisa e flessibile. Lo uso MOLTO per estrarre i dati dal mio codice e posizionarli in un posto più utilizzabile.

Ad esempio, ho spesso creato menu come questo:

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

Ciò mi consentirebbe di scrivere il codice come per impostare un sistema di menu. Il "+" è sufficiente per dirgli di posizionare quell'elemento sotto l'elemento precedente.

Potrei associarlo alla classe menuHandler tramite una convenzione di denominazione dei metodi nominando i miei metodi come "menuFile, menuFileSave, menuFileLoad, ..." e legandoli in modo riflessivo (ci sono altre alternative).

Questa sintassi consente una definizione del menu incredibilmente breve e un metodo "initMenus" estremamente riutilizzabile. (Eppure non mi preoccupo di riutilizzarlo perché è sempre divertente scrivere e richiede solo pochi minuti + alcune righe di codice).

ogni volta che vedi un pattern nel tuo codice, vedi se riesci a sostituirlo con qualcosa del genere e ricorda sempre quanto sia sintetica la sintassi di inizializzazione dell'array !.


5
Questo sarebbe anche preferibile fare come varargs. Inoltre, a chi piace scrivere il codice per "divertimento" merita un voto negativo! La codifica riguarda la risoluzione di nuovi problemi, non la digitazione. Oh aspetta, questo è Java ;-)
mjaggard il

1
Hai ragione, quando ho scritto questo non avevo usato molto varargs - e ho usato l'inizializzazione dell'array un po 'prima che esistessero varargs in java. L'unica parte per la quale preferirei ancora le matrici è che se lo definisci come un array puoi renderlo una costante nella parte superiore del file invece dei dati incorporati, e puoi anche estrarlo in un file di configurazione
Bill K

A proposito, 8 anni dopo dovrei dire che ora mi trovo a usare le annotazioni per fare quasi tutto ciò per cui ho usato array di stringhe inizializzati.
Bill K,

2

Un'altra opzione è utilizzare ArrayUtils.toArray in org.apache.commons.lang3

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

È un'alternativa, tuttavia ha ulteriori chiamate funzionali che si aggiungono allo stack che non sono necessarie.
CybeX,

1

Come dice Draemon, il più vicino che Java arriva agli array in linea è new String[]{"blah", "hey", "yo"}tuttavia esiste un trucco che ti permette di fare qualcosa di simile

array("blah", "hey", "yo") con il tipo inferito automaticamente.

Ho lavorato su un'API utile per aumentare il linguaggio Java per consentire array e tipi di raccolta inline. Per maggiori dettagli progetto google Espresso4J o dai un'occhiata qui


9
Solo un paio di problemi qui: 1. Assicurati che nei tuoi post e nel tuo profilo sia chiaramente chiaro che sei affiliato con Espresso4J (vedi le nostre FAQ ) 2. Si prega di fare attenzione a pubblicare collegamenti al proprio sito Web su post abbastanza vecchi ( in particolare risposte come questa e questa ) - è molto spammy e solleva bandiere che ammacceranno il tuo rappresentante.
Kev

@Kev ah scusa. Ho chiarito che sono lo sviluppatore del bel progetto Espresso4J ora :)
Jonathan Weatherhead,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.