2010-07-20 8 views
87

Collection<Foo> ürünümüz var. Foo[]'a dönüştürmek için en iyi (mevcut içerikteki en kısa sürede LoC) nedir? Herhangi bir iyi bilinen kitaplığına izin verilir. (Bu bölümdeki bir daha dava; sen bunun için başka bir iş parçacığı oluşturmak için değer olduğunu düşünüyorum eğer yorum bırakmak):Koleksiyona diziyi dönüştürmenin en kolay yolu?

UPD ne dönüştürülmesi konusunda Collection<Foo>Bar[] nereye Bar sahiptir tip Foo yani public Bar(Foo foo){ ... } 1 parametresi ile yapıcı? x

cevap

205

koleksiyon: bunu bir kez ya da bir döngü içinde birden fazla kullanırsanız

Foo[] foos = x.toArray(new Foo[x.size()]); 
+24

** basit ** (kolay) ama en iyi (bellek): 'x.toArray (yeni Foo [0])' --- ** dokümantasyon **: okumak için zaman yok ... –

+0

Basitlik ... basittir birkaç kişi kendi kendine tekmeleyecek diye düşünüyor – David

+5

@Carlos aslında, (yeni Foo [0]) 'dan daha iyi bir bellek kullanır. Collection.toArray belgelerine göre, bu koleksiyondaki öğelerin depolanacağı diziyi, eğer yeterince büyükse, bu onları doğrudan yeni dizide saklayacağı anlamına gelir. Eğer bir boyut 0 dizisi verirseniz, yeni bir dizi oluşturacaktır, yani küçük bir diziniz ve bu tür gereksiz olduğunda büyük bir dizi var demektir. – corsiKa

10

, bir sabit

public static final Foo[] FOO = new Foo[]{}; 

tanımlayıp

gibi dönüşüme yapabileceğini
Foo[] foos = fooCollection.toArray(FOO); 

toArray yöntemi, belirlemek için boş diziyi alır e hedef dizinin doğru türü ve sizin için yeni bir dizi oluşturun. güncelleme gelince

Foo[] a = x.toArray(new Foo[x.size()]); 

:

int i = 0; 
Bar[] bars = new Bar[fooCollection.size()]; 
for(Foo foo : fooCollection) { // where fooCollection is Collection<Foo> 
    bars[i++] = new Bar(foo); 
}  
+1

ups, 'const' Java değil! 'public static final Foo [] FOO = {} ' –

+1

neden halka açık olsun? –

+0

@ Zoltán - neden olmasın? Bu değişmez, bu yüzden bir güvenlik sorunu sunmuyor. Bu biraz dağınıklık, ama diğer kodlarda yararlı olabilir, bu yüzden genellikle zararsızdır. Belki de bu sabitlerin hepsiyle birlikte merkezi bir sınıf yaratırlar ve daha sonra bunlara ulaşmak için 'import static' kullanırlar. – Jules

1

:


İşte güncelleme için teklifim güncelleştirme tarikatı dava için çözüm iyon (Google Tahsilat yardımıyla):

Collections2.transform (fooCollection, new Function<Foo, Bar>() { 
    public Bar apply (Foo foo) { 
     return new Bar (foo); 
    } 
}).toArray (new Bar[fooCollection.size()]); 

Fakat, burada the doublep's answer sözü edilen anahtar yaklaşımı (I toArray yöntemi için unuttum). Java 8 kullanılarak güncellenen soruya

3

İşte son var orijinal bkz doublep yanıt için

Collection<Foo> foos = new ArrayList<Foo>(); 
Collection<Bar> temp = new ArrayList<Bar>(); 
for (Foo foo:foos) 
    temp.add(new Bar(foo)); 
Bar[] bars = temp.toArray(new Bar[]{}); 
+1

Bu çözüm için de geçerli olan iplik güvenliği hakkında çift taraflı cevap hakkındaki yorumumu görün. Yeni Bar [0] 'sorunu engelliyor. – Jules

26

Alternatif çözüm:

Bar[] result = foos.stream() 
    .map(x -> new Bar(x)) 
    .toArray(size -> new Bar[size]); 
+25

Bu, 'Bar [] result = foos.stream() haritası (Bar :: new) .toArray (Bar [] :: new);' – lpandzic

+0

Sözdizimi bilge kabul edilen cevabı çok tercih ederim . Keşke herkes Python'a geçsin. –