Bir diziyi satır içinde bildirmenin bir yolu var mı?


617

Diyelim ki bir dizge argümanı olarak alan bir m () yöntemim var. Arama yaptığımda bu diziyi satır içinde bildirebilmemin bir yolu var mı? yani Yerine:

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

Bunu sadece bir satırla değiştirebilir ve asla kullanmayacağım adlandırılmış bir değişken bildirmekten kaçınabilir miyim?


2
Yeniden faktoringi destekleyen bir IDE, satır içi strleri otomatik olarak yapmanızı sağlar.
Paul McKenzie

Yanıtlar:


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

77
Sadece ileride başvurmak üzere, bu tür dizi anonim dizi olarak bilinir (adı yoktur). "Anonim dizi java" araması bazı sonuçlar doğururdu.
Falaina

2
Döküm benzer. Sanırım bunu böyle düşüneceğim, bu yüzden bunu yapmam gereken bir bluemoon'da bir kez google'a ihtiyacım yok.
ArtOfWarfare

Bu, yalnızca kodlu bir yanıtın tamamen kabul edilebilir ve hatta belki de tercih edilebilir olduğu nadir bir durumdur.
Max von Hippel

113

Draemon doğru. Ayrıca ilan edebilir malma olarak 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
oldukça güzel bir sözdizimi, ancak bu yöntemle yalnızca bir dizi parametresi olabilir ve sonuncusu olmalıdır. Yani yapamazsınız: void m(String... strs, Integer... intgrs)örneğin.
bluefoot

5
blefoot haklı. Ama yapabilirsinizvoid m(Integer i, Double d, String... str)
Igor S.

@MichaelMyers Anlamı nedir(String ... strs)
Kasun Siyambalapitiya

1
@KasunSiyambalapitiya: Cevabımdaki bağlantıyı tıklayın.
Michael Myers

30

Bunu yapmanın başka bir yolu, sonucu satır içi Liste olarak istiyorsanız, bunu şu şekilde yapabilirsiniz:

Arrays.asList(new String[] { "String1", "string2" });

38
aslında bir dizi oluşturmak gerekmez, basitçe yapabilirsiniz:Arrays.asList("string1", "string2", ...)
Elias Dorneles

2
Olası faydalı nokta: Bunu ilkellerle yapamazsınız. Bir tek eleman ile bitireceğiz Listarasında type[]nerede typeolduğu ilkel. örneğin Arrays.asList([some ints])a List<int[]>.
Moira

@Antonio Carlos: hayır, değil. Sen diyebilirsin setdöndü üzerinde Listve diziyi değiştirir.
Holger

17

Başlatıcı olmadan diziyi doğrudan modern Java'ya yazabilirsiniz. Örneğiniz artık geçerlidir. Parametreyi yine de adlandırmak en iyisidir.

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

veya

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

Eğer varsa sahip satır içi, sen türü bildirmek gerekir:

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

veya varargs (değişken argümanları) kullanın

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

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

Umarım Java'nın geliştiricileri de örtülü başlatma sağlayacak geleceğe

Güncelleme: Kotlin Cevap

Kotlin dizilerle çalışmayı çok daha kolay hale getirdi ! Çoğu tür için, sadece kullanın arrayOfve türü dolaylı olarak belirler. Boş bırakmak için hiçbir şey yapmayın.

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

İlkellerin fayda işlevleri vardır. Boş bırakmak için hiçbir şey yapmayın.

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

Zaten bir a'nız varsa Collectionve bunu bir satır içi diziye dönüştürmek istiyorsanız, şunu kullanın:

collection.toTypedArray()

Bir dizi türünü zorlamanız gerekiyorsa, şunu kullanın:

array.toIntArray()
array.toLongArray()
array.toCharArray()
...

Ama yapamazsın doSomething({"blah", "hey", "yo"}), asıl sorunun sorduğu şey buydu.
David DeMar

11

Bir yerde bir yöntem oluşturabilirsiniz

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

o zaman kullan

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

daha iyi bir görünüm için.


3

Dizi başlatma sözdiziminin çok kısa ve esnek olduğunu eklemek istiyorum. Benim kodu veri ayıklamak ve daha kullanışlı bir yere yerleştirmek için bir çok kullanın.

Örnek olarak, genellikle bunun gibi menüler oluşturdum:

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

Bu bir menü sistemi kurmak için gelen kodu yazmama izin verir. "+" Öğeyi önceki öğenin altına koymasını söylemek için yeterlidir.

Ben menuHile, menuFileSave, menuFileLoad, ... "gibi bir şey adlandırarak ve yansıtıcı (diğer alternatifler vardır) gibi bir yöntem adlandırma kuralı adlandırma yöntemiyle menuHandler sınıfına bağlayabilirsiniz.

Bu sözdizimi AMAZINGLY kısa menü tanımına ve son derece tekrar kullanılabilir bir "initMenus" yöntemine izin verir. (Yine de tekrar kullanmak zahmet etmiyorum çünkü yazmak her zaman eğlenceli ve sadece birkaç dakika + birkaç kod satırı alıyor).

kodunuzda bir kalıp gördüğünüzde, bunu böyle bir şeyle değiştirip değiştiremeyeceğinize bakın ve dizi başlatma sözdiziminin ne kadar özlü olduğunu her zaman hatırlayın !.


5
Bu aynı zamanda varargs olarak da tercih edilir. Ayrıca, "eğlence" için kod yazmayı seven herkes bir downvote hak ediyor! Kodlama yeni sorunları çözmekle ilgilidir, yazmakla değil. Oh bekle, bu Java ;-)
mjaggard

1
Haklısın, bunu yazdığımda varargs'ı çok fazla kullanmamıştım - ve varargs java'da bulunmadan önce dizi başlatmayı kullandım. Hala dizileri tercih ettiğim bir kısım, onu bir arayış olarak tanımlarsanız, satır içi veriler yerine dosyanın üstünde sabit hale getirebileceğiniz ve ayrıca bir yapılandırma dosyasına da çıkarabileceğinizdir
Bill K

Bu arada, 8 yıl sonra, başlangıçta dize dizilerini kullanmak için kullandığım hemen hemen her şeyi yapmak için ek açıklamaları kullanarak kendimi bulduğumu söylemeliyim.
Bill K

2

Diğer seçenek org.apache.commons.lang3 içinde ArrayUtils.toArray kullanmaktır

ArrayUtils.toArray("elem1","elem2")

Bu bir alternatiftir, ancak yığına eklenen gereksiz fonksiyonel çağrılara sahiptir.
CybeX

1

Draemon'un dediği gibi, Java'nın satır içi dizilere en yakın gelmesi, bunun new String[]{"blah", "hey", "yo"}gibi bir şey yapmanıza izin veren düzgün bir numaradır.

array("blah", "hey", "yo") tür otomatik olarak çıkarılır.

Satır içi diziler ve toplama türleri için Java dilini artırmak için yararlı bir API üzerinde çalışıyorum. Daha fazla bilgi için google projesi Espresso4J veya buradan göz atın


9
Burada sadece birkaç sorun: 1. Lütfen yazılarınızda ve profilinizde Espresso4J ile bağlı olduğunuzu açıkça belirttiğinizden emin olun (lütfen SSS bölümümüze bakın ) 2. Lütfen oldukça eski yayınlarda kendi web sitenize bağlantılar göndermeye dikkat edin ( özellikle bu ve bunun gibi ortak cevaplar ) - çok spam gibi çıkıyor ve temsilcinizi çırpacak bayrakları kaldırıyor.
Kev

@Kev ah üzgünüm. Şu anda iyi Espresso4J projesinin geliştiricisi olduğumu açıkladım :)
Jonathan Weatherhead
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.