Hiện nay, các nhà sưu tập toList()
được thực hiện bằng cách sử dụng và trả lại một ArrayList
(lưu ý rằng container được sử dụng trong bộ sưu tập không phải lúc nào cũng phải phù hợp với loại kết quả cuối cùng của). Cách này, giao diện thu thập được xác định, bộ thu không có khả năng định cỡ trước danh sách. Nhưng về nguyên tắc, do việc triển khai Stream chuẩn và việc triển khai thu thập toList()
được xác định trước là một phần của cùng một thư viện, có thể có một giao tiếp không chuẩn trong các triển khai trong tương lai (hoặc các JRE thay thế) trong đó luồng phát hiện bộ thu toList()
phương thức collect
và thực hiện thao tác được tối ưu hóa. Nhưng khi sử dụng bộ thu toList()
, ví dụ: với tư cách là người thu gom ở hạ lưu của bộ sưu tập groupingBy
, không có kích thước có thể dự đoán được.
Nếu bạn cho rằng con suối có thể dự đoán kích thước của nó, giống như trong myList.stream().map(doWhatever)
ví dụ của bạn, giải pháp hiệu quả nhất, do việc thực hiện hiện nay, là
List<ElementType> result=Arrays.asList(stream.toArray(ElementType[]::new));
như hoạt động sẽ sử dụng các kích thước được biết đến, ngay cả trong song song, hoặc đặc biệt là khi được sử dụng với luồng song song khi có thể dự đoán được kích thước phụ, do không có bước hợp nhất, nghĩa là tất cả công nhân sẽ ghi trực tiếp vào mảng kết quả.
Thật không may, nếu ElementType
không phải là loại có thể xác minh lại, bạn phải sử dụng thao tác không được kiểm tra tại đây.
Nếu kích thước không thể dự đoán được, giải pháp này có thể vẫn hiệu quả hơn so với bộ thu toList()
hiện tại, nhưng có thể bị mất so với triển khai trong tương lai có thể sử dụng bộ nhớ phi tuyến tính.
Vì vậy, biến thể được tối ưu hóa chỉ phù hợp với một thiết lập nhất định. Đối với hầu hết các kịch bản, bộ thu toList()
là đủ hoặc thậm chí có thể tốt hơn bất kỳ sự thay thế nào trong các triển khai có thể trong tương lai.
'Người thu gom. toList() 'sử dụng một' ArrayList'. Việc phân bổ lại xảy ra giống hệt như bất kỳ 'ArrayList' nào khác. –