Soru Guava veya Apache Commons koleksiyonlarında herhangi bir genel toArray () sürümü var mı?


Aradığım şey genel bir versiyonudur. Object[] java.util.Collection.toArray() veya kullanmak için daha az ayrıntılı bir alternatif T[] java.util.Collection.toArray(T[] array). Şu anda yazabilirim:

Collection<String> strings;
String[] array = strings.toArray(new String[strings.size()]);

Aradığım şey şunun gibi:

@SuppressWarnings("unchecked")
public static <T> T[] toArray(Collection<T> collection, Class<T> clazz) {
    return collection.toArray((T[]) Array.newInstance(clazz, collection.size()));
}

daha sonra şu şekilde kullanabilirsiniz:

String[] array = Util.toArray(strings, String.class);

Guava'da mı yoksa Commons koleksiyonlarında mı uygulanan böyle bir şey?

Tabii ki kendim yazabilirim (yukarıdaki), toArray (T [] dizisi) kadar hızlı görünüyor.


25
2018-02-12 13:43


Menşei


Yani temel olarak, sadece koymak zorunda değilsiniz array parametresi, ancak statik bir yöntem için bir sınıf adı ve bunun yerine bir sınıf değişkeni yerine koymaktan mutlu musunuz? - chrylis
Eşit sayıda karakteri kestirmek istiyorsanız strings.size() uzunluk, bu dönüşümü çok fazla taşıdığınızı ima eder. Öyleyse cevap daha az. - Boris the Spider
Endişeleniyorsun çünkü 8 tane daha fazla karakter var mı? - Olivier Grégoire
Keşke daha az kullanabilseydim. Daha da önemlisi, strings.size() sürüm daha az okunabilir ve daha fazla hata eğilimli (ikisi de strings değiştirirken senk.) Iterables.toArray(). Daha da fazla, şimdi yazabilirim Iterables.toArray(fooReturningArray(), String.class). - Mihai


Cevaplar:


Iterables.toArray() Guava'dan.


41
2018-02-12 14:12



Mükemmel. Teşekkürler! - Mihai


İle kısaltabilirsiniz

String[] array = strings.toArray(new String[0]);

ki bu da daha verimli olur.

Java 8 ile bunu da kullanabilirsiniz, ancak gereksiz yere karmaşık ve muhtemelen daha yavaş görünüyor:

String[] array = strings.stream().toArray(String[]::new);     // Java 8

8
2018-02-12 13:48



Teşekkür ederim. Ancak, Java 8'i kullanamıyorum veya bellekle sınırlı cihazlarda (android) gereksiz yere nesneler oluşturmak istemiyorum strings.toArray(new String[0]). Ayrıca, bu çözümler çok daha okunabilir değil strings.toArray(new String[strings.size()]). - Mihai
Bu 'yeni String [0]' lar performansınız için herhangi bir fark yaratıyorsa, tebrikler, hızlı bir çığlık uygulamanız gerekir. - Kevin Bourrillion
new String[0] aslında daha hızlı olacak: shipilev.net/blog/2016/arrays-wisdom-ancients - Karol S
@KarolS Kesinlikle, değiştirildi. Bunu daha sonra keşfettim: stackoverflow.com/a/29444594/829571 - assylias


Guava sözdizimi özellikle

Iterables.toArray(strings, String.class);

4
2017-08-30 01:06