2009-07-20 23 views
463

Digamos que tengo un método m() que toma una matriz de cadenas como argumento. ¿Hay alguna manera de declarar esta matriz en línea cuando realizo la llamada? En lugar de decir:¿Alguna forma de declarar una matriz en línea?

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

¿Puedo reemplazar esto con una sola línea, y evitar que se declara una variable llamada que nunca voy a usar?

+2

un IDE que soporta re-factoring le permitiría in- línea strs automáticamente. –

Respuesta

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

Solo para referencia futura, este tipo de matriz se conoce como matriz anónima (ya que no tiene nombre). buscar "Anonymous array java" habría producido algunos resultados. – Falaina

+1

Se parece a la fundición. Creo que así es como lo pensaré, así que no tengo que buscarlo en Google una vez en una luna azul. Necesito hacer esto. – ArtOfWarfare

91

Draemon es correcto. También se pueden declarar como tomar mvarargs:

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 
+12

sintaxis bastante agradable, pero con este método puede tener solo un parámetro de matriz, y debe ser el último. Por lo tanto, no puede hacer: 'void m (String ... strs, Integer ... intgrs)' por ejemplo. – bluefoot

+5

blefoot tiene razón. Pero puede hacer 'void m (Integer i, Double d, String ... str)' –

+0

@MichaelMyers Cuál es el significado de '(String ... strs)' –

2

me gustaría añadir que la sintaxis de matrices de inicialización es muy breve y flexible. Lo uso MUCHO para extraer datos de mi código y ubicarlo en otro lugar más útil.

menús Como ejemplo, he crean a menudo como este:

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

Esto permitiría que escriba vienen código para configurar un sistema de menús. El "+" es suficiente para indicarle que coloque ese artículo debajo del ítem anterior.

Podría vincularlo a la clase menuHandler mediante un método de nomenclatura de convenciones nombrando mis métodos como "menuFile, menuFileSave, menuFileLoad, ..." y vinculándolos de forma reflexiva (hay otras alternativas).

Esta sintaxis permite una increíblemente breve definición de menú y un método "initMenus" extremadamente reutilizable. (Sin embargo, no me molesto en reutilizarlo porque siempre es divertido escribir y solo toma unos minutos + unas pocas líneas de código).

cada vez que vea un patrón en su código, vea si puede reemplazarlo con algo como esto, y siempre recuerde cuán breve es la sintaxis de inicialización de la matriz.

+4

Esto también sería preferible hacer como varargs. ¡Además, a quien le guste escribir código para "diversión" merece un voto negativo! La codificación se trata de resolver nuevos problemas, no escribir. Oh, espera, esto es Java ;-) – mjaggard

+1

Tienes razón, cuando escribí esto no había usado varargs mucho, y utilicé la inicialización de matrices bastante antes de que existieran varargs en Java. La parte por la que preferiría las matrices es que si la defines como aray puedes hacerla constante en la parte superior del archivo en lugar de datos en línea, y también puedes extraerla a un archivo de configuración –

+0

Por cierto , 8 años más tarde tendría que decir que ahora me encuentro usando anotaciones para hacer casi todas las cosas que solía usar para las matrices de cadenas inicializadas. –

1

Como dice DRAEMON, el más cercano que Java trata de inline matrices es new String[]{"blah", "hey", "yo"} sin embargo hay un truco que le permite hacer algo como

array("blah", "hey", "yo") con el tipo deducido automáticamente.

He estado trabajando en una API útil para aumentar el lenguaje Java para permitir matrices en línea y tipos de colección. Para obtener más detalles Google Project Espresso4J o comprobar que funciona here

+7

Solo un par de cuestiones aquí: 1. Asegúrese de que en sus publicaciones y perfil deje en claro que está afiliado a Espresso4J (consulte nuestra [FAQ # promoción]) 2. Tenga cuidado al publicar enlaces a su propio sitio web en publicaciones bastante antiguas (especialmente respuestas repetitivas como esta y [esta]] (http://stackoverflow.com/questions/1473868/why-cant-i-create-a-new-java-array-inline/7300580#7300580)) - sale como muy spam y levanta banderas que harán mella en tu representante. – Kev

+0

@Kev, lo siento. He aclarado que soy el desarrollador del excelente proyecto Espresso4J ahora :) –

20

Otra manera de hacer eso, si desea que el resultado como una línea de lista, puede hacerlo de esta manera:

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

en realidad no necesitas crear una matriz, puedes hacer simplemente: 'Arrays.asList (" string1 "," string2 ", .. .) ' – elias

+1

¡Sí! = D Y solo para recordar, la matriz creada de esta manera, es inmutable. –

+2

Posible punto útil: No puede hacer esto con primitivos. Usted terminará con una 'Lista' de un solo elemento de' tipo [] 'donde' tipo' es esa primitiva. p.ej. 'Arrays.asList ([some ints])' da como resultado una 'List '. – Moira

3

Se puede crear un método en algún lugar

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

y utilizarla

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

para ver mejor.

1

Ahora puede escribir directamente la matriz en Java moderno, sin un inicializador. Tu ejemplo ahora es válido

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

o

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

Otra opción es utilizar ArrayUtils.toArray en org.apache.commons.lang3

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