ด้วย JDK / 11 วิธีอื่นในการแปลง a Collection<Foo>เป็นFoo[]สามารถใช้Collection.toArray(IntFunction<T[]> generator)เป็น:
Foo[] foos = fooCollection.toArray(new Foo[0]); // before JDK 11
Foo[] updatedFoos = fooCollection.toArray(Foo[]::new); // after JDK 11
ตามที่@Stuartอธิบายไว้ในรายชื่ออีเมล (เน้นของฉัน) ประสิทธิภาพของสิ่งนี้ควรจะเหมือนกับของที่มีอยู่Collection.toArray(new T[0])-
ผลลัพธ์คือการใช้งานที่ใช้Arrays.copyOf() นั้นเร็วที่สุดอาจเป็นเพราะมันเป็นสิ่งที่อยู่ภายในมันเป็นที่แท้จริง
สามารถหลีกเลี่ยงการเติมอาร์เรย์ที่จัดสรรใหม่เป็นศูนย์ได้เนื่องจากรู้ว่าเนื้อหาอาร์เรย์ทั้งหมดจะถูกเขียนทับ สิ่งนี้เป็นจริงไม่ว่า API สาธารณะจะเป็นอย่างไร
การใช้งาน API ภายใน JDK อ่าน:
default <T> T[] toArray(IntFunction<T[]> generator) {
return toArray(generator.apply(0));
}
เริ่มต้นใช้งานเรียกร้องที่จะได้รับอาเรย์ความยาวเป็นศูนย์แล้วก็โทรgenerator.apply(0) toArray(T[])นี้จะต้องผ่านเส้นทางได้อย่างรวดเร็วดังนั้นมันเป็นหลักความเร็วเดียวกับArrays.copyOf()
toArray(new T[0])
หมายเหตุ : - เพียงแค่ให้คำแนะนำในการใช้ API ควบคู่ไปกับความเข้ากันไม่ได้ย้อนหลังเมื่อใช้สำหรับโค้ดที่มีnullค่าเช่นtoArray(null)เนื่องจากการเรียกเหล่านี้จะคลุมเครือเนื่องจากมีอยู่toArray(T[] a)และจะไม่สามารถรวบรวมได้
Stream.toArrayAPI ที่มีอยู่จาก JDK