Alguma maneira de declarar uma matriz em linha?

617

Digamos que eu tenho um método m () que usa uma matriz de Strings como argumento. Existe uma maneira de simplesmente declarar essa matriz em linha quando faço a chamada? Em vez de:

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

Posso apenas substituir isso por uma linha e evitar declarar uma variável nomeada que nunca vou usar?

DivideByHero
fonte
2
Um IDE que suporte refatoração permitiria strs in-line automaticamente.
21139 Paul McKenzie

Respostas:

945
m(new String[]{"blah", "hey", "yo"});
Draemon
fonte
77
Apenas para referência futura, esse tipo de matriz é conhecido como matriz anônima (pois não tem nome). pesquisar "java de matriz anônima" teria produzido alguns resultados.
Falaina
2
Assemelha-se a fundição. Eu acho que é assim que vou pensar, para não precisar pesquisar no google uma vez em um bluemoon que preciso fazer isso.
ArtOfWarfare
Este é o caso raro em que uma resposta somente de código é totalmente aceitável e, de fato, talvez até preferível.
Max von Hippel em
113

Draemon está correto. Você também pode declarar mcomo tendo 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
fonte
19
sintaxe bastante agradável, mas com esse método você pode ter apenas um parâmetro de matriz e deve ser o último. Então, você não pode fazer: void m(String... strs, Integer... intgrs)por exemplo.
Bluefoot
5
blefoot está certo. Mas você pode fazervoid m(Integer i, Double d, String... str)
Igor S.
@MichaelMyers Qual é o significado de(String ... strs)
Kasun Siyambalapitiya
1
@KasunSiyambalapitiya: Clique no link na minha resposta.
Michael Myers
30

Outra maneira de fazer isso, se você deseja o resultado como uma Lista embutida, pode fazê-lo assim:

Arrays.asList(new String[] { "String1", "string2" });
Antonio Carlos
fonte
38
você realmente não precisa criar uma matriz, você pode fazer simplesmente:Arrays.asList("string1", "string2", ...)
Elias Dorneles
2
Ponto possivelmente útil: você não pode fazer isso com primitivas. Você terminará com um único elemento Listde type[]onde typeé esse primitivo. por exemplo, Arrays.asList([some ints])resulta em a List<int[]>.
Moira
@ Antonio Carlos: não, não é. Você pode chamar seto retornado Liste ele modificará a matriz.
Holger
17

Você pode escrever diretamente a matriz no Java moderno, sem um inicializador. Seu exemplo agora é válido. Geralmente, é melhor nomear o parâmetro de qualquer maneira.

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

ou

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

Se você precisar fazer a linha, precisará declarar o tipo:

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

ou use varargs (argumentos variáveis)

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

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

Espero que os desenvolvedores de Java permitam a inicialização implícita no futuro

Atualização: Resposta do Kotlin

Kotlin tornou muito mais fácil trabalhar com matrizes ! Para a maioria dos tipos, basta usar arrayOfe isso determinará implicitamente o tipo. Não passe nada para deixá-los vazios.

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

Primitivas têm funções utilitárias. Não passe nada para deixá-los vazios.

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

Se você já possui um Collectione deseja convertê-lo em um array embutido, basta usar:

collection.toTypedArray()

Se você precisar coagir um tipo de matriz, use:

array.toIntArray()
array.toLongArray()
array.toCharArray()
...
Gibolt
fonte
Mas você não pode fazer doSomething({"blah", "hey", "yo"}), que é o que a pergunta original estava perguntando.
David DeMar
11

Você pode criar um método em algum lugar

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

então use

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

para uma melhor aparência.

Mahpooya
fonte
3

Eu gostaria de acrescentar que a sintaxe de inicialização do array é muito sucinta e flexível. Eu uso muito para extrair dados do meu código e colocá-los em algum lugar mais utilizável.

Como exemplo, muitas vezes eu criei menus como este:

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

Isso me permitiria escrever um código para configurar um sistema de menus. O "+" é suficiente para dizer a ele para colocar esse item no item anterior.

Eu poderia vinculá-lo à classe menuHandler por uma convenção de nomenclatura de métodos, nomeando meus métodos como "menuFile, menuFileSave, menuFileLoad, ..." e vinculando-os de forma reflexiva (existem outras alternativas).

Essa sintaxe permite uma definição de menu INCRÍVEL, INCRÍVEL, e um método "initMenus" extremamente reutilizável. (No entanto, eu não me incomodo em reutilizá-lo porque é sempre divertido escrever e leva apenas alguns minutos + algumas linhas de código).

sempre que vir um padrão em seu código, verifique se é possível substituí-lo por algo assim e lembre-se sempre de quão sucinta é a sintaxe de inicialização da matriz !.

Bill K
fonte
5
Isso também seria preferível fazer como varargs. Além disso, quem gosta de digitar código por "diversão" merece um voto negativo! Codificar é resolver novos problemas, não digitar. Oh, espere, isso é Java ;-)
mjaggard
1
Você está certo, quando escrevi isso, não havia usado muito o varargs - e usei a inicialização de array um pouco antes de o varargs existir em java. A única parte para a qual eu ainda prefiro matrizes é que, se você a definir como um aray, poderá torná-lo uma constante na parte superior do arquivo, em vez de dados embutidos, e também poderá extraí-lo para um arquivo de configuração
Bill K
A propósito, oito anos depois, eu diria que agora me vejo usando anotações para fazer quase todas as coisas que costumava usar matrizes de seqüência de caracteres inicializadas.
Bill K
2

Outra opção é usar ArrayUtils.toArray em org.apache.commons.lang3

ArrayUtils.toArray("elem1","elem2")
Shravan Ramamurthy
fonte
É uma alternativa, no entanto, há chamadas funcionais adicionais adicionando à pilha que são desnecessárias.
CybeX 13/08/19
1

Como diz Draemon, o mais próximo que o Java chega das matrizes embutidas é new String[]{"blah", "hey", "yo"}no entanto, há um truque interessante que permite fazer algo como

array("blah", "hey", "yo") com o tipo inferido automaticamente.

Eu tenho trabalhado em uma API útil para aprimorar a linguagem Java para permitir matrizes inline e tipos de coleção. Para mais detalhes, projeto do Google Espresso4J ou confira aqui

Jonathan Weatherhead
fonte
9
Apenas algumas questões aqui: 1. Certifique-se de que, em suas postagens e perfil, deixe bem claro que é afiliado ao Espresso4J (consulte nossas Perguntas frequentes ) 2. Tenha cuidado ao publicar links para seu próprio site em postagens bastante antigas ( especialmente respostas padronizadas como esta e esta ) - ele aparece como muito spam e gera bandeiras que prejudicam seu representante.
Kev
@Kev ah desculpe. Eu já esclareceu que Eu sou o desenvolvedor do projeto Espresso4J bem agora :)
Jonathan Weatherhead