Với JDK / 11, một cách khác để chuyển đổi Collection<Foo>
thành một Foo[]
có thể là sử dụng Collection.toArray(IntFunction<T[]> generator)
như:
Foo[] foos = fooCollection.toArray(new Foo[0]); // before JDK 11
Foo[] updatedFoos = fooCollection.toArray(Foo[]::new); // after JDK 11
Như được giải thích bởi @Stuart trong danh sách gửi thư (nhấn mạnh của tôi), hiệu suất của việc này về cơ bản phải giống như của hiện tại Collection.toArray(new T[0])
-
Kết quả cuối cùng là việc triển khai sử dụng Arrays.copyOf(
) là nhanh nhất, có thể vì đó là nội tại .
Nó có thể tránh không điền vào mảng được phân bổ mới vì nó biết toàn bộ nội dung mảng sẽ bị ghi đè. Điều này đúng bất kể API công khai trông như thế nào.
Việc triển khai API trong JDK đọc:
default <T> T[] toArray(IntFunction<T[]> generator) {
return toArray(generator.apply(0));
}
Việc thực hiện mặc định gọi generator.apply(0)
để có được một mảng có độ dài bằng không và sau đó chỉ cần gọi toArray(T[])
. Điều này đi qua Arrays.copyOf()
con đường nhanh, vì vậy về cơ bản nó có cùng tốc độ toArray(new T[0])
.
Lưu ý : - Chỉ cần sử dụng API sẽ được hướng dẫn cùng với tính không tương thích ngược khi được sử dụng cho mã vớinull
các giá trị, ví dụ nhưtoArray(null)
các cuộc gọi này bây giờ sẽ không rõ ràng vì hiện cótoArray(T[] a)
và sẽ không biên dịch được.
Stream.toArray
API hiện có từ JDK.