Từ các tài liệu của Spliterator
:
Một Spliterator cũng báo cáo một bộ characteristics()
của cấu trúc của nó, nguồn, và các yếu tố trong số ORDERED
, DISTINCT
, SORTED
, SIZED
, NONNULL
, IMMUTABLE
, CONCURRENT
và SUBSIZED
. Đây có thể được sử dụng bởi khách hàng Spliterator để kiểm soát, chuyên môn hóa hoặc đơn giản hóa tính toán.
Lưu ý rằng nó không đề cập đến việc ngăn ngừa NullPointerException
s. Nếu bạn sắp xếp một Stream
mà có thể chứa null
giá trị nó là trách nhiệm của bạn để cung cấp một Comparator
mà có thể xử lý null
s.
Câu thứ hai cũng làm rõ rằng việc sử dụng các cờ này chỉ là một tùy chọn, không phải là yêu cầu cho "khách hàng Spliterator", không giới hạn sử dụng bởi Stream
s.
Vì vậy, bất kể nó được sử dụng bởi việc thực hiện hiện hành của Stream
API, đang có khả năng để đạt được lợi thế của kiến thức về một NONULL
đặc trưng?
Tôi nghĩ vậy. Việc triển khai có thể phân nhánh thành mã chuyên biệt cho một số không null
Spliterator
để sử dụng null
để đại diện cho một số trạng thái nhất định, ví dụ: giá trị vắng mặt hoặc giá trị ban đầu trước khi xử lý phần tử đầu tiên, v.v. Nếu thực tế, mã thực thi thực tế để xử lý Stream
s có thể chứa null
là phức tạp. Nhưng tất nhiên, bạn luôn phải cân nhắc xem việc đơn giản hóa một trường hợp có biện minh cho việc sao chép mã hay không.
Nhưng đôi khi việc đơn giản hóa đơn giản như biết rằng không có giá trị null
ngụ ý rằng bạn có thể sử dụng một trong số Concurrent…
Bộ sưu tập, không cho phép null
s, trong nội bộ.
Hmmwait ... Không phải là 'Khách hàng chủ yếu của Stream ở đây? Tôi có thể quá hẹp đầu óc nhưng tôi không thấy những khách hàng khác mà bạn có thể nghĩ ra. Chắc chắn, bạn có thể thực hiện của riêng bạn (tôi đã làm điều đó), nhưng khác hơn là sử dụng nó trong một 'Stream' ... – fge
Không phải là" bạn có thể thực hiện của riêng bạn "một điểm mạnh, nếu không * điểm * của Java API, có hỗ trợ bạn bằng cách viết ứng dụng của riêng bạn thay vì cung cấp các ứng dụng hoàn chỉnh? Bên cạnh đó, 'Stream' là các máy khách chính, vâng, nhưng điều đó không bị giới hạn đối với * hiện tại * của 'Stream'. Việc thêm một đặc tính mới trong một phiên bản trong tương lai sẽ yêu cầu một bản phát hành chính, nhưng việc thêm vào việc thực hiện (sử dụng tốt hơn) cờ đã tồn tại có thể xảy ra trong mọi cập nhật nhỏ. Vì vậy, đó là một chiến lược hợp lý để thêm cờ có giá trị tiềm năng càng sớm càng tốt. – Holger
Vâng, tôi đồng ý đó là một điểm mạnh; Tôi đoán tôi không đủ hiểu biết về các quyết định thiết kế đằng sau nó: / – fge