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ć?


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"});

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

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" });

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()
...

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.


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 !.


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")

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.