Adakah cara untuk mendeklarasikan array in-line?

617

Katakanlah saya memiliki metode m () yang menggunakan array String sebagai argumen. Apakah ada cara saya bisa mendeklarasikan array ini secara in-line ketika saya melakukan panggilan? yaitu Alih-alih:

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

Bisakah saya mengganti ini dengan satu baris, dan menghindari mendeklarasikan variabel bernama yang saya tidak akan pernah gunakan?

DivideByHero
sumber
2
IDE yang mendukung re-factoring akan memungkinkan Anda untuk menyediakan str in-line secara otomatis.
Paul McKenzie

Jawaban:

945
m(new String[]{"blah", "hey", "yo"});
Draemon
sumber
77
Hanya untuk referensi di masa mendatang, jenis array ini dikenal sebagai array anonim (karena tidak memiliki nama). mencari "Java array anonim" akan menghasilkan beberapa hasil.
Falaina
2
Itu menyerupai casting. Saya pikir itulah bagaimana saya akan memikirkannya jadi saya tidak perlu google itu sekali dalam bluemoon saya perlu melakukan ini.
ArtOfWarfare
Ini adalah contoh langka di mana jawaban hanya kode benar-benar dapat diterima, dan pada kenyataannya, bahkan mungkin lebih disukai.
Max von Hippel
113

Draemon benar. Anda juga dapat mendeklarasikan msebagai mengambil 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
sumber
19
sintaks yang cukup bagus, tetapi dengan metode ini Anda hanya dapat memiliki satu parameter array, dan itu harus menjadi yang terakhir. Jadi, Anda tidak dapat melakukannya: void m(String... strs, Integer... intgrs)misalnya.
bluefoot
5
pengelupasan benar. Tapi Anda bisa melakukannyavoid m(Integer i, Double d, String... str)
Igor S.
@MichaelMyers Apa arti dari(String ... strs)
Kasun Siyambalapitiya
1
@KasunSiyambalapitiya: Klik tautan di jawaban saya.
Michael Myers
30

Cara lain untuk melakukannya, jika Anda ingin hasilnya sebagai Daftar inline, Anda dapat melakukannya seperti ini:

Arrays.asList(new String[] { "String1", "string2" });
Antonio Carlos
sumber
38
Anda sebenarnya tidak perlu membuat array, Anda dapat melakukannya hanya:Arrays.asList("string1", "string2", ...)
Elias Dorneles
2
Poin yang mungkin berguna: Anda tidak dapat melakukan ini dengan primitif. Anda akan berakhir dengan satu elemen Listdi type[]mana typeprimitif itu. misalnya Arrays.asList([some ints])menghasilkan a List<int[]>.
Moira
@Antonio Carlos: tidak, tidak. Anda dapat memanggil setyang dikembalikan Listdan itu akan mengubah array.
Holger
17

Anda dapat langsung menulis array di Jawa modern, tanpa inisialisasi. Contoh Anda sekarang valid. Biasanya yang terbaik adalah memberi nama parameter.

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

atau

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

Jika harus inline, Anda harus mendeklarasikan jenisnya:

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

atau gunakan varargs (argumen variabel)

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

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

Semoga pengembang Java akan memungkinkan inisialisasi implisit di masa depan

Pembaruan: Jawaban Kotlin

Kotlin telah membuat bekerja dengan array jauh lebih mudah! Untuk sebagian besar tipe, cukup gunakan arrayOfdan itu akan secara implisit menentukan tipe. Berikan apa-apa agar kosong.

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

Primitif memiliki fungsi utilitas. Berikan apa-apa agar kosong.

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

Jika Anda sudah memiliki Collectiondan ingin mengubahnya menjadi array inline, cukup gunakan:

collection.toTypedArray()

Jika Anda perlu memaksa jenis array, gunakan:

array.toIntArray()
array.toLongArray()
array.toCharArray()
...
Gibolt
sumber
Tetapi Anda tidak bisa melakukannya doSomething({"blah", "hey", "yo"}), yang merupakan pertanyaan asli yang ditanyakan.
David DeMar
11

Anda dapat membuat metode di suatu tempat

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

lalu gunakan itu

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

untuk tampilan yang lebih baik.

Mahpooya
sumber
3

Saya ingin menambahkan bahwa sintaks inisialisasi array sangat ringkas dan fleksibel. Saya menggunakannya BANYAK untuk mengekstrak data dari kode saya dan menempatkannya di tempat yang lebih dapat digunakan.

Sebagai contoh, saya sering membuat menu seperti ini:

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

Ini akan memungkinkan saya untuk menulis kode datang untuk mengatur sistem menu. "+" Sudah cukup untuk membuatnya menempatkan item itu di bawah item sebelumnya.

Saya bisa mengikatnya ke kelas menuHandler baik dengan metode penamaan konvensi dengan menamai metode saya seperti "menuFile, menuFileSave, menuFileLoad, ..." dan mengikat mereka secara reflektif (ada alternatif lain).

Sintaks ini memungkinkan definisi menu singkat yang LUAR BIASA dan metode "initMenus" yang dapat digunakan kembali. (Namun saya tidak repot menggunakannya kembali karena selalu menyenangkan untuk menulis dan hanya membutuhkan beberapa menit + beberapa baris kode).

setiap kali Anda melihat pola dalam kode Anda, lihat apakah Anda dapat menggantinya dengan sesuatu seperti ini, dan selalu ingat betapa ringkas sintaks inisialisasi array!

Bill K.
sumber
5
Ini juga akan lebih baik dilakukan sebagai varargs. Juga, siapa pun yang suka mengetik kode untuk "bersenang-senang" layak menerima downvote! Pengkodean adalah tentang menyelesaikan masalah baru, bukan mengetik. Oh, tunggu, ini Java ;-)
mjaggard
1
Anda benar, ketika saya menulis ini saya tidak menggunakan varargs banyak - dan saya menggunakan inisialisasi array sedikit sebelum varargs ada di java. Satu bagian yang saya masih lebih suka array adalah bahwa jika Anda mendefinisikannya sebagai array Anda dapat membuatnya konstan di bagian atas file, bukan data inline, dan Anda juga dapat mengekstraknya ke file konfigurasi
Bill K
Omong-omong, 8 tahun kemudian saya harus mengatakan saya sekarang menemukan diri saya menggunakan anotasi untuk melakukan hampir semua hal yang saya gunakan untuk menggunakan array string yang diinisialisasi.
Bill K
2

Pilihan lain adalah menggunakan ArrayUtils.toArray di org.apache.commons.lang3

ArrayUtils.toArray("elem1","elem2")
Shravan Ramamurthy
sumber
Ini adalah alternatif, namun memiliki panggilan fungsional tambahan yang ditambahkan ke tumpukan yang tidak perlu.
CybeX
1

Seperti yang dikatakan Draemon, yang paling dekat dengan Java dalam array inline adalah new String[]{"blah", "hey", "yo"}ada trik yang memungkinkan Anda untuk melakukan sesuatu seperti

array("blah", "hey", "yo") dengan tipe yang disimpulkan secara otomatis.

Saya telah bekerja pada API yang berguna untuk menambah bahasa Java untuk memungkinkan array inline dan tipe koleksi. Untuk detail lebih lanjut, proyek google Espresso4J atau lihat di sini

Jonathan Weatherhead
sumber
9
Hanya beberapa masalah di sini: 1. Harap pastikan bahwa dalam posting dan profil Anda, Anda membuatnya sangat jelas bahwa Anda berafiliasi dengan Espresso4J (silakan lihat FAQ kami ) 2. Harap berhati-hati memposting tautan ke situs web Anda sendiri pada posting yang cukup lama ( terutama jawaban boilerplate seperti ini dan ini ) - itu muncul sebagai sangat spam dan menimbulkan bendera yang akan melemahkan perwakilan Anda.
Kev
@ Selamat ah maaf. Saya telah mengklarifikasi bahwa saya adalah pengembang proyek Espresso4J yang bagus sekarang :)
Jonathan Weatherhead