JDK / 11, bir dönüştürme alternatif yol ile Collection<Foo>bir etmek Foo[]yararlanmak olabilir Collection.toArray(IntFunction<T[]> generator)gibidir:
Foo[] foos = fooCollection.toArray(new Foo[0]); // before JDK 11
Foo[] updatedFoos = fooCollection.toArray(Foo[]::new); // after JDK 11
Posta listesinde @Stuart tarafından açıklandığı gibi (benim vurgu), bunun performansı esasen mevcut olanla aynı olmalıdır.Collection.toArray(new T[0]) -
Sonuç olarak,) kullanan uygulamalar en hızlıdır, Arrays.copyOf(çünkü muhtemelen bir içseldir .
Yeni tahsis edilen dizinin sıfır doldurulmasını önleyebilir çünkü tüm dizi içeriğinin üzerine yazılacağını bilir. Bu, genel API'nin nasıl göründüğüne bakılmaksızın geçerlidir.
API'nin JDK içindeki uygulaması şu şekildedir:
default <T> T[] toArray(IntFunction<T[]> generator) {
return toArray(generator.apply(0));
}
Varsayılan uygulama generator.apply(0), sıfır uzunluklu bir dizi almayı çağırır ve ardından basitçe çağırır toArray(T[]). Bu Arrays.copyOf()
hızlı yoldan geçer , bu yüzden aslında aynı hızdır toArray(new T[0]).
Not : - API kullanımı,değerlerlekod için kullanıldığında geriye dönük bir uyumsuzluk ile birlikte yönlendirilmelidir,nullörneğin,toArray(null)bu çağrılar artık mevcut olduğundan dolayı belirsiztoArray(T[] a)olacak ve derlenemeyeceğinden.
Stream.toArray, JDK'daki mevcut API ile eşleşir .