ด้วย 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.toArray
API ที่มีอยู่จาก JDK