W jakiś sposób zadeklarować tablicę w linii?

617

Powiedzmy, że mam metodę m (), która przyjmuje tablicę ciągów jako argument. Czy istnieje sposób, aby po prostu zadeklarować tę tablicę w linii podczas wykonywania połączenia? tj. zamiast:

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

Czy mogę po prostu zastąpić to jedną linią i uniknąć deklarowania nazwanej zmiennej, której nigdy nie będę używać?

DivideByHero
źródło
2
IDE, które obsługuje przefaktoryzowanie, pozwoliłoby ci na automatyczne wstawianie ciągów.
Paul McKenzie,

Odpowiedzi:

945
m(new String[]{"blah", "hey", "yo"});
Draemon
źródło
77
Dla celów przyszłych, ten typ tablicy jest znany jako tablica anonimowa (ponieważ nie ma nazwy). wyszukiwanie „Anonymous array java” przyniosłoby pewne wyniki.
Falaina
2
Przypomina odlewanie. Myślę, że tak o tym pomyślę, więc nie muszę google go raz w bluemoon muszę to zrobić.
ArtOfWarfare
Jest to rzadki przypadek, w którym odpowiedź tylko do kodu jest całkowicie akceptowalna, aw rzeczywistości może nawet lepsza.
Max von Hippel,
113

Draemon ma rację. Możesz również zadeklarować mprzyjmowanie 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
źródło
19
niezła składnia, ale dzięki tej metodzie możesz mieć tylko jeden parametr tablicy i musi to być ostatni. Więc nie możesz: void m(String... strs, Integer... intgrs)na przykład.
bluefoot
5
blefoot ma rację. Ale możesz to zrobićvoid m(Integer i, Double d, String... str)
Igor S.,
@MichaelMyers Jakie jest znaczenie(String ... strs)
Kasun Siyambalapitiya
1
@KasunSiyambalapitiya: Kliknij link w mojej odpowiedzi.
Michael Myers
30

Innym sposobem, aby to zrobić, jeśli chcesz, aby wynik był wstawiany jako List, możesz to zrobić w następujący sposób:

Arrays.asList(new String[] { "String1", "string2" });
Antonio Carlos
źródło
38
właściwie nie musisz tworzyć tablicy, możesz po prostu:Arrays.asList("string1", "string2", ...)
Elias Dorneles
2
Prawdopodobnie przydatny punkt: nie możesz tego zrobić z prymitywami. Skończysz z pojedynczego elementu Listz type[]którym typejest prymitywne. np. Arrays.asList([some ints])wyniki w List<int[]>.
Moira
@Antonio Carlos: nie, nie jest. Możesz wywołać setzwrócone, Lista to zmodyfikuje tablicę.
Holger,
17

Możesz bezpośrednio napisać tablicę we współczesnej Javie, bez inicjatora. Twój przykład jest teraz ważny. Generalnie najlepiej jest mimo to nazwać parametr.

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

lub

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

Jeśli masz do inline, musisz zadeklarować typ:

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

lub użyj varargs (zmienne argumenty)

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

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

Mamy nadzieję, że programiści Javy umożliwią domyślną inicjalizację w przyszłości

Aktualizacja: odpowiedź Kotlin

Kotlin znacznie ułatwił pracę z tablicami ! W przypadku większości typów wystarczy użyć arrayOfi domyślnie określi typ. Podaj nic, aby zostawić je puste.

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

Prymitywy mają funkcje narzędziowe. Podaj nic, aby zostawić je puste.

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

Jeśli masz już Collectioni chcesz przekonwertować go na wbudowaną tablicę, po prostu użyj:

collection.toTypedArray()

Aby wymusić typ tablicy, użyj:

array.toIntArray()
array.toLongArray()
array.toCharArray()
...
Gibolt
źródło
Ale nie możesz tego zrobić doSomething({"blah", "hey", "yo"}), o co pierwotnie zadawano pytanie.
David DeMar
11

Możesz gdzieś stworzyć metodę

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

następnie użyj go

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

dla lepszego wyglądu.

Mahpooya
źródło
3

Chciałbym dodać, że składnia inicjalizacji tablicy jest bardzo zwięzła i elastyczna. Używam go dużo, aby wyodrębnić dane z mojego kodu i umieścić je w bardziej użytecznym miejscu.

Na przykład często tworzyłem takie menu:

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

Pozwoliłoby mi to napisać kod come, aby skonfigurować system menu. „+” Wystarczy, aby umieścić ten element pod poprzednim elementem.

Mógłbym powiązać go z klasą menuHandler poprzez konwencję nazewnictwa metod, nazywając moje metody czymś w rodzaju „menuFile, menuFileSave, menuFileLoad, ...” i wiążąc je refleksyjnie (istnieją inne alternatywy).

Ta składnia pozwala NA NIESAMOWITE krótkie definicje menu i niezwykle wielokrotną metodę „initMenus”. (Jednak nie zawracam sobie głowy ponownym użyciem, ponieważ pisanie jest zawsze fajne i zajmuje tylko kilka minut + kilka wierszy kodu).

za każdym razem, gdy zobaczysz wzorzec w kodzie, sprawdź, czy możesz go zastąpić czymś takim, i zawsze pamiętaj, jak zwięzła jest składnia inicjalizacji tablicy !.

Bill K.
źródło
5
Byłoby to również zalecane jako varargs. Każdy, kto lubi pisać kod dla „zabawy”, zasługuje na pochwałę! Kodowanie polega na rozwiązywaniu nowych problemów, a nie pisaniu. Och, czekaj, to jest Java ;-)
mjaggard,
1
Masz rację, kiedy to napisałem, nie używałem dużo varargs - i użyłem inicjalizacji tablicy dość długo, zanim varargs istniało w java. Jedną częścią, dla której nadal wolę tablice, jest to, że jeśli zdefiniujesz go jako aray, możesz ustawić go jako stałą na górze pliku zamiast danych wbudowanych, a także możesz wyodrębnić go do pliku konfiguracyjnego
Bill K
Nawiasem mówiąc, 8 lat później muszę powiedzieć, że teraz używam adnotacji, aby robić prawie wszystkie rzeczy, do których używałem zainicjowanych tablic ciągów.
Bill K
2

Inną opcją jest użycie ArrayUtils.toArray w org.apache.commons.lang3

ArrayUtils.toArray("elem1","elem2")
Shravan Ramamurthy
źródło
Jest to alternatywa, jednak ma dodatkowe wywołania funkcjonalne dodające do stosu, które są niepotrzebne.
CybeX
1

Jak mówi Draemon, Java najbliższa macierzom wbudowanym jest new String[]{"blah", "hey", "yo"}jednak fajna sztuczka, która pozwala zrobić coś takiego

array("blah", "hey", "yo") z automatycznie wywnioskowanym typem.

Pracowałem nad użytecznym interfejsem API do rozszerzenia języka Java, aby umożliwić wbudowane tablice i typy kolekcji. Aby uzyskać więcej informacji, przejdź do projektu Google Espresso4J lub sprawdź tutaj

Jonathan Weatherhead
źródło
9
Kilka kwestii tutaj: 1. Upewnij się, że w swoich postach i profilu wyraźnie zaznaczasz, że jesteś powiązany z Espresso4J (zobacz nasze FAQ ) 2. Zachowaj ostrożność, zamieszczając linki do własnej witryny na dość starych postach ( szczególnie odpowiedzi na takie pytania, jak ta i ta ) - jest bardzo spamerska i podnosi flagi, które wgniecą twojego przedstawiciela.
Kev
@Kev ah przepraszam. Wyjaśniłem, że jestem teraz twórcą dobrego projektu Espresso4J :)
Jonathan Weatherhead