¿Alguna forma de declarar una matriz en línea?

617

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 hago la llamada? es decir, en lugar de:

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

¿Puedo reemplazar esto con una línea y evitar declarar una variable con nombre que nunca voy a usar?

DivideByHero
fuente
2
Un IDE que admita la refactorización le permitiría insertar cadenas en línea automáticamente.
Paul McKenzie el

Respuestas:

945
m(new String[]{"blah", "hey", "yo"});
Draemon
fuente
77
Solo para referencia futura, este tipo de matriz se conoce como una matriz anónima (ya que no tiene nombre). buscar "Java anónimo de la matriz" habría producido algunos resultados.
Falaina el
2
Se asemeja a fundición. Creo que así es como lo pensaré, así que no tengo que buscarlo en Google la vez en una luna azul que necesito hacer esto.
ArtOfWarfare
Esta es la rara instancia en la que una respuesta de solo código es totalmente aceptable y, de hecho, tal vez incluso preferible.
Max von Hippel
113

Draemon es correcto. También puede declarar mcomo tomar 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
fuente
19
bastante buena sintaxis, pero con este método solo puede tener un parámetro de matriz, y debe ser el último. Entonces, no puedes hacer: void m(String... strs, Integer... intgrs)por ejemplo.
bluefoot
55
Blefoot tiene razón. Pero puedes hacerlovoid m(Integer i, Double d, String... str)
Igor S.
@MichaelMyers ¿Cuál es el significado de(String ... strs)
Kasun Siyambalapitiya
1
@KasunSiyambalapitiya: haga clic en el enlace de mi respuesta.
Michael Myers
30

Otra forma de hacerlo, si desea el resultado como una Lista en línea, puede hacerlo así:

Arrays.asList(new String[] { "String1", "string2" });
Antonio Carlos
fuente
38
en realidad no necesita crear una matriz, puede hacer simplemente:Arrays.asList("string1", "string2", ...)
Elias Dorneles
2
Punto posiblemente útil: no se puede hacer esto con primitivas. Terminarás con un solo elemento Listde type[]dónde typeestá esa primitiva. ej. Arrays.asList([some ints])resultados en a List<int[]>.
Moira
@Antonio Carlos: no, no lo es. Puede llamar setal devuelto Listy modificará la matriz.
Holger
17

Puede escribir directamente la matriz en Java moderno, sin un inicializador. Su ejemplo ahora es válido. En general, es mejor nombrar el parámetro de todos modos.

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

o

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

Si tiene que estar en línea, deberá declarar el tipo:

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

o usar varargs (argumentos variables)

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

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

Esperemos que los desarrolladores de Java permitan la inicialización implícita en el futuro.

Actualización: Respuesta de Kotlin

¡Kotlin ha hecho que trabajar con matrices sea ​​mucho más fácil! Para la mayoría de los tipos, solo use arrayOfy determinará implícitamente el tipo. No pase nada para dejarlos vacíos.

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

Las primitivas tienen funciones de utilidad. No pase nada para dejarlos vacíos.

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

Si ya tiene un Collectiony desea convertirlo en una matriz en línea, simplemente use:

collection.toTypedArray()

Si necesita forzar un tipo de matriz, use:

array.toIntArray()
array.toLongArray()
array.toCharArray()
...
Gibolt
fuente
Pero no puede hacer doSomething({"blah", "hey", "yo"}), que es sobre lo que estaba preguntando la pregunta original.
David DeMar
11

Puedes crear un método en alguna parte

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

entonces úsalo

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

para una mejor apariencia

Mahpooya
fuente
3

Me gustaría agregar que la sintaxis de inicialización de matriz es muy sucinta y flexible. Lo uso MUCHO para extraer datos de mi código y colocarlo en un lugar más utilizable.

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

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

Esto me permitiría escribir el código Come para configurar un sistema de menús. El "+" es suficiente para decirle que coloque ese elemento debajo del elemento anterior.

Podría vincularlo a la clase menuHandler ya sea mediante una convención de nomenclatura de métodos nombrando mis métodos de forma similar a "menuFile, menuFileSave, menuFileLoad, ..." y vinculándolos reflexivamente (hay otras alternativas).

Esta sintaxis permite una definición de menú increíblemente breve y un método "initMenus" extremadamente reutilizable. (Sin embargo, no me molesto en reutilizarlo porque siempre es divertido escribirlo 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 sucinta es la sintaxis de inicialización de la matriz.

Bill K
fuente
55
Esto también sería preferible hacer como varargs. Además, cualquiera a quien le guste escribir código por "diversión" merece un voto negativo. La codificación se trata de resolver nuevos problemas, no de escribir. Oh, espera, esto es Java ;-)
mjaggard
1
Tienes razón, cuando escribí esto, no había usado mucho varargs, y usé la inicialización de la matriz bastante antes de que existieran los varargs en Java. La única parte para la que aún preferiría las matrices es que si la define como una matriz, puede convertirla en una constante en la parte superior del archivo en lugar de datos en línea, y también puede extraerla en un archivo de configuración
Bill K
Por cierto, 8 años después, tendría que decir que ahora me encuentro usando anotaciones para hacer casi todas las cosas para las que solía usar matrices de cadenas inicializadas.
Bill K
2

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

ArrayUtils.toArray("elem1","elem2")
Shravan Ramamurthy
fuente
Es una alternativa, sin embargo, tiene llamadas funcionales adicionales que se agregan a la pila que son innecesarias.
CybeX
1

Como dice Draemon, lo más cercano que Java está a las matrices en línea es new String[]{"blah", "hey", "yo"} sin embargo, que hay un buen truco que te permite hacer algo como

array("blah", "hey", "yo") con el tipo inferido 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 más detalles, google proyecto Espresso4J o échale un vistazo aquí

Jonathan Weatherhead
fuente
99
Solo un par de problemas aquí: 1. Asegúrese de que en sus publicaciones y perfil deje en claro que está afiliado a Espresso4J (consulte nuestras preguntas frecuentes ) 2. Tenga cuidado al publicar enlaces a su propio sitio web en publicaciones bastante antiguas ( especialmente respuestas repetitivas como esta y esta ): se presenta como muy spam y levanta banderas que afectarán a su representante.
Kev
@Kev ah lo siento. He aclarado que soy el desarrollador del excelente proyecto Espresso4J ahora :)
Jonathan Weatherhead